BloodMagic/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java

176 lines
6 KiB
Java
Raw Normal View History

2016-01-09 18:17:38 -05:00
package WayofTime.bloodmagic.ritual;
import java.util.ArrayList;
import java.util.List;
2016-01-09 18:17:38 -05:00
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
2016-01-09 18:17:38 -05:00
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;
import WayofTime.bloodmagic.api.ritual.Ritual;
import WayofTime.bloodmagic.api.ritual.RitualComponent;
2016-07-11 16:47:27 -04:00
import WayofTime.bloodmagic.api.saving.SoulNetwork;
import WayofTime.bloodmagic.api.soul.EnumDemonWillType;
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
2016-07-11 16:47:27 -04:00
import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler;
import WayofTime.bloodmagic.registry.ModBlocks;
import WayofTime.bloodmagic.util.Utils;
2016-01-09 18:17:38 -05:00
public class RitualCrushing extends Ritual
{
public static final String CRUSHING_RANGE = "crushingRange";
public static final String CHEST_RANGE = "chest";
2016-01-09 18:17:38 -05:00
2016-07-11 16:47:27 -04:00
public static double rawWillDrain = 0.5;
public static double steadfastWillDrain = 0.5;
2016-01-09 18:17:38 -05:00
public RitualCrushing()
{
super("ritualCrushing", 0, 5000, "ritual." + Constants.Mod.MODID + ".crushingRitual");
2016-01-09 18:17:38 -05:00
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);
2016-01-09 18:17:38 -05:00
}
@Override
public void performRitual(IMasterRitualStone masterRitualStone)
{
World world = masterRitualStone.getWorldObj();
SoulNetwork network = NetworkHelper.getSoulNetwork(masterRitualStone.getOwner());
int currentEssence = network.getCurrentEssence();
if (currentEssence < getRefreshCost())
{
network.causeNausea();
2016-01-09 18:17:38 -05:00
return;
}
2016-07-11 16:47:27 -04:00
BlockPos pos = masterRitualStone.getBlockPos();
TileEntity tile = world.getTileEntity(pos.up());
List<EnumDemonWillType> willConfig = masterRitualStone.getActiveWillConfig();
double steadfastWill = willConfig.contains(EnumDemonWillType.STEADFAST) ? WorldDemonWillHandler.getCurrentWill(world, pos, EnumDemonWillType.STEADFAST) : 0;
boolean isSilkTouch = steadfastWill >= steadfastWillDrain;
2016-01-09 18:17:38 -05:00
int fortune = 0;
AreaDescriptor crushingRange = getBlockRange(CRUSHING_RANGE);
for (BlockPos newPos : crushingRange.getContainedPositions(pos))
{
if (world.isAirBlock(newPos))
{
continue;
}
IBlockState state = world.getBlockState(newPos);
Block block = state.getBlock();
if (block.equals(ModBlocks.ritualController) || block.equals(ModBlocks.ritualStone) || block.getBlockHardness(state, world, newPos) == -1.0F)
2016-01-09 18:17:38 -05:00
{
continue;
}
if (isSilkTouch && block.canSilkHarvest(world, newPos, state, null))
{
2016-07-11 16:47:27 -04:00
ItemStack checkStack = block.getItem(world, newPos, state);
if (checkStack == null)
{
continue;
}
ItemStack copyStack = checkStack.copy();
if (steadfastWill >= steadfastWillDrain)
{
WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastWillDrain, true);
steadfastWill -= steadfastWillDrain;
} else
{
continue;
}
2016-01-09 18:17:38 -05:00
if (tile != null)
2016-07-11 16:47:27 -04:00
copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN);
else
Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack);
2016-01-09 18:17:38 -05:00
2016-07-11 16:47:27 -04:00
if (copyStack != null && copyStack.stackSize > 0)
2016-01-09 18:17:38 -05:00
{
Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack);
2016-01-09 18:17:38 -05:00
}
} else
{
List<ItemStack> stackList = block.getDrops(world, newPos, state, fortune);
if (stackList != null && !stackList.isEmpty())
{
for (ItemStack item : stackList)
{
ItemStack copyStack = ItemStack.copyItemStack(item);
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)
2016-01-09 18:17:38 -05:00
{
Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack);
2016-01-09 18:17:38 -05:00
}
}
}
}
world.destroyBlock(newPos, false);
network.syphon(getRefreshCost());
break;
2016-01-09 18:17:38 -05:00
}
}
@Override
public int getRefreshTime()
{
return 40;
}
@Override
public int getRefreshCost()
{
return 7;
}
@Override
public ArrayList<RitualComponent> getComponents()
{
ArrayList<RitualComponent> components = new ArrayList<RitualComponent>();
this.addParallelRunes(ritualComponents, 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;
}
@Override
public Ritual getNewCopy()
{
return new RitualCrushing();
}
}