A lot more implementation work for custom areas for rituals.

This commit is contained in:
WayofTime 2016-04-11 15:36:27 -04:00
parent 51c79f15a9
commit 91ddb8b761
13 changed files with 127 additions and 26 deletions

View file

@ -43,6 +43,10 @@ public abstract class AreaDescriptor implements Iterator<BlockPos>
public abstract boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit);
public abstract int getVolume();
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
@ -243,6 +247,18 @@ public abstract class AreaDescriptor implements Iterator<BlockPos>
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 && minimumOffset.getX() >= -horizontalLimit && maximumOffset.getX() < horizontalLimit && minimumOffset.getZ() >= -horizontalLimit && maximumOffset.getZ() < horizontalLimit;
}
}
public static class HemiSphere extends AreaDescriptor
@ -386,6 +402,20 @@ public abstract class AreaDescriptor implements Iterator<BlockPos>
// TODO Auto-generated method stub
return false;
}
@Override
public int getVolume()
{
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isWithinRange(int verticalLimit, int horizontalLimit)
{
// TODO Auto-generated method stub
return false;
}
}
public static class Cross extends AreaDescriptor
@ -493,5 +523,19 @@ public abstract class AreaDescriptor implements Iterator<BlockPos>
// TODO Auto-generated method stub
return false;
}
@Override
public int getVolume()
{
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isWithinRange(int verticalLimit, int horizontalLimit)
{
// TODO Auto-generated method stub
return false;
}
}
}

View file

@ -46,7 +46,9 @@ public interface IMasterRitualStone
void provideInformationOfRangeToPlayer(EntityPlayer player, String range);
void setActiveWillDrain(EntityPlayer player, List<EnumDemonWillType> typeList);
void setActiveWillConfig(EntityPlayer player, List<EnumDemonWillType> typeList);
boolean setBlockRangeByBounds(EntityPlayer player, String range, BlockPos offset1, BlockPos offset2);
List<EnumDemonWillType> getCurrentActiveWillConfig();
}

View file

@ -18,6 +18,7 @@ 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.EnumDemonWillType;
/**
* Abstract class for creating new rituals. Rituals need be registered with
@ -230,9 +231,10 @@ public abstract class Ritual
protected boolean canBlockRangeBeModified(String range, AreaDescriptor descriptor, IMasterRitualStone master, BlockPos offset1, BlockPos offset2)
{
int maxVolume = volumeRangeMap.get(range);
int maxVertical = verticalRangeMap.get(range);
int maxHorizontal = horizontalRangeMap.get(range);
List<EnumDemonWillType> willConfig = master.getCurrentActiveWillConfig();
int maxVolume = getMaxVolumeForRange(range, willConfig);
int maxVertical = getMaxVerticalRadiusForRange(range, willConfig);
int maxHorizontal = getMaxHorizontalRadiusForRange(range, willConfig);
return (maxVolume <= 0 || descriptor.getVolumeForOffsets(offset1, offset2) <= maxVolume) && descriptor.isWithinRange(offset1, offset2, maxVertical, maxHorizontal);
}
@ -244,6 +246,26 @@ public abstract class Ritual
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<EnumDemonWillType> activeTypes)
{
return volumeRangeMap.get(range);
}
public int getMaxVerticalRadiusForRange(String range, List<EnumDemonWillType> activeTypes)
{
return verticalRangeMap.get(range);
}
public int getMaxHorizontalRadiusForRange(String range, List<EnumDemonWillType> activeTypes)
{
return horizontalRangeMap.get(range);
}
public ITextComponent getErrorForBlockRangeOnFail(EntityPlayer player, String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2)
{
AreaDescriptor descriptor = this.getBlockRange(range);