diff --git a/changelog.txt b/changelog.txt index 8e1a9318..2e41c6a1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -10,6 +10,9 @@ Version 2.1.0-67 - 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. ------------------------------------------------------ Version 2.1.0-66 diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index d986471c..a5a279bc 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -202,7 +202,7 @@ public class ConfigHandler category = "Blood Altar Sacrificial Values"; config.addCustomCategoryComment(category, "Entity Sacrificial Value Settings"); - entitySacrificeValuesList = config.getStringList("entitySacrificeValues", category, new String[] { "EntityVillager;2000", "EntitySlime;150", "EntityEnderman;200", "EntityCow;250", "EntityChicken;250", "EntityHorse;250", "EntitySheep;250", "EntityWolf;250", "EntityOcelot;250", "EntityPig;250", "EntityRabbit;250", "EntityArmorStand;0" }, "Used to edit the amount of LP gained per sacrifice of 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;LPPerSacrifice"); + entitySacrificeValuesList = config.getStringList("entitySacrificeLP:HPValues", category, new String[] { "EntityVillager;100", "EntitySlime;15", "EntityEnderman;10", "EntityCow;100", "EntityChicken;100", "EntityHorse;250", "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"); buildEntitySacrificeValues(); category = "Potions"; diff --git a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java index 62593b60..c65e63cd 100644 --- a/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/BloodMagicAPI.java @@ -221,7 +221,8 @@ public class BloodMagicAPI * @param entityClass * - The class of the entity to blacklist. * @param sacrificeValue - * - The Amount of LP to provide per each entity sacrificed. + * - The Amount of LP to provide per each HP of the entity + * sacrificed. */ public static void setEntitySacrificeValue(Class entityClass, int sacrificeValue) { @@ -235,7 +236,8 @@ public class BloodMagicAPI * @param entityClassName * - The name of the class of the entity to blacklist. * @param sacrificeValue - * - The Amount of LP to provide per each entity sacrificed. + * - The Amount of LP to provide per each HP of the entity + * sacrificed. */ public static void setEntitySacrificeValue(String entityClassName, int sacrificeValue) { diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 507ce821..d38e74f7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -33,6 +33,7 @@ public class Constants 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 CURRENT_PURITY = "BM:CurrentPurity"; public static final String EMPTY = "Empty"; public static final String OUTPUT_AMOUNT = "outputAmount"; public static final String INPUT_AMOUNT = "inputAmount"; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java b/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java new file mode 100644 index 00000000..d96db141 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IPurificationAsh.java @@ -0,0 +1,12 @@ +package WayofTime.bloodmagic.api.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/api/util/helper/PurificationHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java new file mode 100644 index 00000000..4bf13551 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PurificationHelper.java @@ -0,0 +1,39 @@ +package WayofTime.bloodmagic.api.util.helper; + +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) + { + NBTTagCompound data = animal.getEntityData(); + if (data.hasKey(Constants.NBT.CURRENT_PURITY)) + { + return data.getDouble(Constants.NBT.CURRENT_PURITY); + } + + return 0; + } + + 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) + { + 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/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java index 8e80527b..6735b95b 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java @@ -20,6 +20,10 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity protected int ticksInAir = 0; protected int maxTicksInAir = 600; + protected double radiusModifier = 1; + protected double explosionModifier = 1; + protected double fillerChance = 0; + @Setter public ItemStack meteorStack; @@ -28,7 +32,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity super(world); } - public EntityMeteor(World world, double x, double y, double z, double velX, double velY, double velZ) + 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); @@ -36,6 +40,9 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity motionX = velX; motionY = velY; motionZ = velZ; + this.radiusModifier = radiusModifier; + this.explosionModifier = explosionModifier; + this.fillerChance = fillerChance; } @Override @@ -88,7 +95,7 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity public void generateMeteor(BlockPos pos) { - MeteorRegistry.generateMeteorForItem(meteorStack, worldObj, pos, Blocks.STONE.getDefaultState()); + MeteorRegistry.generateMeteorForItem(meteorStack, worldObj, pos, Blocks.STONE.getDefaultState(), radiusModifier, explosionModifier, fillerChance); } public DamageSource getDamageSource() @@ -102,7 +109,9 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity 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); if (meteorStack != null) { meteorStack.writeToNBT(nbt); @@ -115,6 +124,9 @@ public class EntityMeteor extends EntityThrowable implements IThrowableEntity super.readEntityFromNBT(nbt); ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR); maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); + radiusModifier = nbt.getDouble("radiusModifier"); + explosionModifier = nbt.getDouble("explosionModifier"); + fillerChance = nbt.getDouble("fillerChance"); meteorStack = ItemStack.loadItemStackFromNBT(nbt); } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java index 2098be12..abdbb755 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java @@ -4,12 +4,14 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.entity.EntityLivingBase; +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.util.SoundCategory; + import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -17,8 +19,9 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.ConfigHandler; import WayofTime.bloodmagic.api.BloodMagicAPI; import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper; +import WayofTime.bloodmagic.api.util.helper.PurificationHelper; +import WayofTime.bloodmagic.client.IVariantProvider; public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { @@ -47,17 +50,23 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider return false; String entityName = target.getClass().getSimpleName(); - int lifeEssence = 500; + int lifeEssenceRatio = 25; if (ConfigHandler.entitySacrificeValues.containsKey(entityName)) - lifeEssence = ConfigHandler.entitySacrificeValues.get(entityName); + lifeEssenceRatio = ConfigHandler.entitySacrificeValues.get(entityName); if (BloodMagicAPI.getEntitySacrificeValues().containsKey(entityName)) - lifeEssence = BloodMagicAPI.getEntitySacrificeValues().get(entityName); + lifeEssenceRatio = BloodMagicAPI.getEntitySacrificeValues().get(entityName); - if (lifeEssence <= 0) + if (lifeEssenceRatio <= 0) return false; + int lifeEssence = (int) (lifeEssenceRatio * target.getHealth()); + if (target instanceof EntityAnimal) + { + lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((EntityAnimal) target))); + } + if (PlayerSacrificeHelper.findAndFillAltar(attacker.worldObj, 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); diff --git a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java index b4aa271b..0a28f0b3 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java @@ -34,17 +34,19 @@ public class Meteor this.maxWeight = maxWeight; } - public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock) + public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { - world.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), explosionStrength, true, true); + 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 = -getRadius(); i <= getRadius(); i++) + for (int i = -radius; i <= radius; i++) { - for (int j = -getRadius(); j <= getRadius(); j++) + for (int j = -radius; j <= radius; j++) { - for (int k = -getRadius(); k <= getRadius(); k++) + for (int k = -radius; k <= radius; k++) { - if (i * i + j * j + k * k > (getRadius() + 0.5) * (getRadius() + 0.5)) + if (i * i + j * j + k * k > (floatingRadius + 0.5) * (floatingRadius + 0.5)) { continue; } @@ -54,15 +56,19 @@ public class Meteor if (world.isAirBlock(newPos) || Utils.isBlockLiquid(state)) { - IBlockState placedState = getRandomOreFromComponents(fillerBlock); - world.setBlockState(newPos, placedState); + IBlockState placedState = getRandomOreFromComponents(fillerBlock, fillerChance); + if (placedState != null) + { + world.setBlockState(newPos, placedState); + } } } } } } - public IBlockState getRandomOreFromComponents(IBlockState fillerBlock) + //fillerChance is the chance that the filler block will NOT be placed + public IBlockState getRandomOreFromComponents(IBlockState fillerBlock, double fillerChance) { int goal = RAND.nextInt(getMaxWeight()); @@ -77,11 +83,11 @@ public class Meteor return state; } else { - return fillerBlock; + return RAND.nextDouble() > fillerChance ? fillerBlock : null; } } } - return fillerBlock; + return RAND.nextDouble() > fillerChance ? fillerBlock : null; } } \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java index 5b580caa..f85cbcc4 100644 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java @@ -41,12 +41,12 @@ public class MeteorRegistry return wrapper != null ? meteorMap.get(wrapper) : null; } - public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock) + 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); + holder.generateMeteor(world, pos, fillerBlock, radiusModifier, explosionModifier, fillerChance); } } } diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualForsakenSoul.java index 1e55c53e..0659e5d4 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 net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -13,12 +14,12 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import WayofTime.bloodmagic.ConfigHandler; 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.saving.SoulNetwork; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.tile.TileDemonCrystal; @@ -127,8 +128,14 @@ public class RitualForsakenSoul extends Ritual if (!entity.isEntityAlive()) { int uniqueness = calculateUniqueness(entity); - willBuffer += getWillForUniqueness(uniqueness) / HEALTH_THRESHOLD * entity.getMaxHealth(); - crystalBuffer += entity.getMaxHealth() / HEALTH_THRESHOLD; + double modifier = 1; + if (entity instanceof EntityAnimal && !entity.isCollided) + { + modifier = 4; + } + + willBuffer += modifier * getWillForUniqueness(uniqueness) / HEALTH_THRESHOLD * entity.getMaxHealth(); + crystalBuffer += modifier * entity.getMaxHealth() / HEALTH_THRESHOLD; totalEffects++; if (totalEffects >= maxEffects) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java index ba36402b..1ef24b08 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualMeteor.java @@ -13,12 +13,17 @@ 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; public class RitualMeteor extends Ritual { public static final String ITEM_RANGE = "itemRange"; + public static final double destructiveWillDrain = 50; public RitualMeteor() { @@ -31,24 +36,66 @@ public class RitualMeteor extends Ritual public void performRitual(IMasterRitualStone masterRitualStone) { World world = masterRitualStone.getWorldObj(); + SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner()); + int currentEssence = network.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 = getBlockRange(ITEM_RANGE); List itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDetectionRange.getAABB(pos)); + double radiusModifier = getRadiusModifier(rawWill); + double explosionModifier = getExplosionModifier(steadfastWill); + double fillerChance = getFillerChance(corrosiveWill); + + boolean successful = false; + for (EntityItem entityItem : itemList) { ItemStack stack = entityItem.getEntityItem(); if (MeteorRegistry.hasMeteorForItem(stack)) { - EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0); + EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0, radiusModifier, explosionModifier, fillerChance); meteor.setMeteorStack(stack.copy()); world.spawnEntityInWorld(meteor); entityItem.setDead(); - masterRitualStone.setActive(false); + if (destructiveWill >= destructiveWillDrain && currentEssence >= 1000000000) + { + network.syphon(1000000); + } 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); } } } @@ -105,4 +152,19 @@ public class RitualMeteor extends Ritual { 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/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java index 0a11baf0..df2f176f 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualWellOfSuffering.java @@ -23,7 +23,7 @@ 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 = 20; + public static final int SACRIFICE_AMOUNT = 25; public BlockPos altarOffsetPos = new BlockPos(0, 0, 0); //TODO: Save! @@ -99,7 +99,17 @@ public class RitualWellOfSuffering extends Ritual { if (entity.attackEntityFrom(DamageSource.outOfWorld, 1)) { - tileAltar.sacrificialDaggerCall(SACRIFICE_AMOUNT, true); + String entityName = entity.getClass().getSimpleName(); + + int lifeEssenceRatio = SACRIFICE_AMOUNT; + + if (ConfigHandler.entitySacrificeValues.containsKey(entityName)) + lifeEssenceRatio = ConfigHandler.entitySacrificeValues.get(entityName); + + if (BloodMagicAPI.getEntitySacrificeValues().containsKey(entityName)) + lifeEssenceRatio = BloodMagicAPI.getEntitySacrificeValues().get(entityName); + + tileAltar.sacrificialDaggerCall(lifeEssenceRatio, true); totalEffects++; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java new file mode 100644 index 00000000..387f5562 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java @@ -0,0 +1,96 @@ +package WayofTime.bloodmagic.tile; + +import java.util.List; + +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +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 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 +{ + 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 != null && 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 = worldObj.getEntitiesWithinAABB(EntityAnimal.class, aabb); + if (animalList.isEmpty()) + { + return; + } + + boolean hasPerformed = false; + + for (EntityAnimal animal : animalList) + { + double added = PurificationHelper.addPurity(animal, Math.min(purityRate, totalPurity), maxPurity); + if (added > 0) + { + totalPurity -= purityRate; + hasPerformed = true; + } + } + + if (hasPerformed) + { + if (worldObj.rand.nextInt(4) == 0 && worldObj instanceof WorldServer) + { + WorldServer server = (WorldServer) worldObj; + 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]); + } + } + } + + @Override + public void deserialize(NBTTagCompound tag) + { + super.deserialize(tag); + totalPurity = tag.getDouble("totalPurity"); + maxPurity = tag.getDouble("maxPurity"); + purityRate = tag.getDouble("purityRate"); + } + + @Override + public NBTTagCompound serialize(NBTTagCompound tag) + { + super.serialize(tag); + + tag.setDouble("totalPurity", totalPurity); + tag.setDouble("maxPurity", maxPurity); + tag.setDouble("purityRate", purityRate); + + return tag; + } +}