diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java index 845dee5f..fdde454b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/Ritual.java @@ -19,6 +19,7 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; /** * Abstract class for creating new rituals. Rituals need be registered with @@ -286,9 +287,9 @@ public abstract class Ritual } } - public ITextComponent provideInformationOfRitualToPlayer(EntityPlayer player) + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) { - return new TextComponentTranslation(this.getUnlocalizedName() + ".info"); + return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info") }; } public ITextComponent provideInformationOfRangeToPlayer(EntityPlayer player, String range) @@ -350,5 +351,10 @@ public abstract class Ritual EXPLOSION, } + 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(); } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java index db3a2aca..347dc718 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java @@ -7,6 +7,7 @@ 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.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.ritual.*; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; @@ -114,6 +115,9 @@ public class ModRituals RitualRegistry.registerRitual(altarBuilderRitual, ConfigHandler.altarBuilderRitual); portalRitual = new RitualPortal(); RitualRegistry.registerRitual(portalRitual, ConfigHandler.portalRitual); + + RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.BASIC), 250, 0.5); + RitualCrushing.registerCuttingFluid(ItemCuttingFluid.getStack(ItemCuttingFluid.EXPLOSIVE), 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 b472c059..b8da0298 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -1,16 +1,24 @@ 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 net.minecraft.block.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.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.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; @@ -20,6 +28,7 @@ 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.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.util.Utils; @@ -29,7 +38,11 @@ public class RitualCrushing extends Ritual public static final String CHEST_RANGE = "chest"; public static double rawWillDrain = 0.5; - public static double steadfastWillDrain = 0.5; + public static double steadfastWillDrain = 0.2; + public static double destructiveWillDrain = 0.2; + + public static Map cuttingFluidLPMap = new HashMap(); + public static Map cuttingFluidWillMap = new HashMap(); public RitualCrushing() { @@ -41,6 +54,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) { @@ -55,15 +74,24 @@ public class RitualCrushing extends Ritual } BlockPos pos = masterRitualStone.getBlockPos(); - TileEntity tile = world.getTileEntity(pos.up()); + AreaDescriptor chestRange = getBlockRange(CHEST_RANGE); + TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); + + if (tile != null && Utils.getNumberOfFreeSlots(tile, EnumFacing.DOWN) < 1) + { + return; + } List willConfig = masterRitualStone.getActiveWillConfig(); - double steadfastWill = willConfig.contains(EnumDemonWillType.STEADFAST) ? WorldDemonWillHandler.getCurrentWill(world, pos, EnumDemonWillType.STEADFAST) : 0; + 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); boolean isSilkTouch = steadfastWill >= steadfastWillDrain; + boolean useCuttingFluid = corrosiveWill > 0; - int fortune = 0; + int fortune = destructiveWill > 0 ? 3 : 0; AreaDescriptor crushingRange = getBlockRange(CRUSHING_RANGE); @@ -81,7 +109,66 @@ public class RitualCrushing extends Ritual continue; } - if (isSilkTouch && block.canSilkHarvest(world, newPos, state, null)) + boolean isBlockClaimed = false; + if (useCuttingFluid) + { + ItemStack checkStack = block.getItem(world, newPos, state); + if (checkStack == null) + { + continue; + } + + 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; + + if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) + { + continue; + } + + cuttingStack = cuttingStack.copy(); + List input = new ArrayList(); + input.add(cuttingStack); + input.add(copyStack); + + AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(input, world, pos); + if (recipe == null) + { + continue; + } + + ItemStack result = recipe.getRecipeOutput(input); + if (result == null) + { + continue; + } + + if (tile != null) + result = Utils.insertStackIntoTile(result, tile, EnumFacing.DOWN); + else + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); + + if (result != null && result.stackSize > 0) + { + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, result); + } + + WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, willDrain, true); + corrosiveWill -= willDrain; + + network.syphon(lpDrain); + currentEssence -= lpDrain; + + isBlockClaimed = true; + } + } + + if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, null)) { ItemStack checkStack = block.getItem(world, newPos, state); if (checkStack == null) @@ -109,8 +196,13 @@ public class RitualCrushing extends Ritual { Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } - } else + } else if (!isBlockClaimed) { + if (fortune > 0 && destructiveWill < destructiveWillDrain) + { + fortune = 0; + } + List stackList = block.getDrops(world, newPos, state, fortune); if (stackList != null && !stackList.isEmpty()) @@ -132,6 +224,12 @@ public class RitualCrushing extends Ritual Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } } + + if (fortune > 0) + { + WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveWillDrain, true); + destructiveWill -= destructiveWillDrain; + } } } @@ -167,6 +265,12 @@ public class RitualCrushing extends Ritual return components; } + @Override + public ITextComponent[] provideInformationOfRitualToPlayer(EntityPlayer player) + { + return new ITextComponent[] { new TextComponentTranslation(this.getUnlocalizedName() + ".info"), new TextComponentTranslation(this.getUnlocalizedName() + ".destructive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".corrosive.info"), new TextComponentTranslation(this.getUnlocalizedName() + ".steadfast.info") }; + } + @Override public Ritual getNewCopy() { diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java index 9a7435b1..c2ee0625 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrystalHarvest.java @@ -80,7 +80,7 @@ public class RitualCrystalHarvest extends Ritual @Override public int getRefreshCost() { - return 0; + return 50; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index b09ff7ed..1e55c53e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java @@ -197,7 +197,7 @@ public class RitualForsakenSoul extends Ritual @Override public int getRefreshCost() { - return 0; + return 2; } @Override diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index d7cee8e3..37a4c662 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -470,6 +470,35 @@ public class Utils return stack; } + public static int getNumberOfFreeSlots(TileEntity tile, EnumFacing 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) == null) + { + slots++; + } + } + } else if (tile instanceof IInventory) + { + for (int i = 0; i < ((IInventory) tile).getSizeInventory(); i++) + { + if (((IInventory) tile).getStackInSlot(i) == null) + { + slots++; + } + } + } + + return slots; + } + public static ItemStack insertStackIntoTile(ItemStack stack, IItemHandler handler) { int numberOfSlots = handler.getSlots(); diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 6294451d..2b0cbdea 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -473,7 +473,11 @@ ritual.BloodMagic.featheredKnifeRitual.info=Drains health from players in its ar 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.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 forcefuly: 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.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.