126 lines
3 KiB
Java
126 lines
3 KiB
Java
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.tile.base.TileTicking;
|
|
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 final int maxWill = 100;
|
|
public final double drainRate = 1;
|
|
|
|
public TileDemonPylon()
|
|
{
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate()
|
|
{
|
|
if (worldObj.isRemote)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (EnumDemonWillType type : EnumDemonWillType.values())
|
|
{
|
|
double currentAmount = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type);
|
|
|
|
for (EnumFacing side : EnumFacing.HORIZONTALS)
|
|
{
|
|
BlockPos offsetPos = pos.offset(side, 16);
|
|
double sideAmount = WorldDemonWillHandler.getCurrentWill(worldObj, 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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void deserialize(NBTTagCompound tag)
|
|
{
|
|
holder.readFromNBT(tag, "Will");
|
|
}
|
|
|
|
@Override
|
|
public NBTTagCompound serialize(NBTTagCompound 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);
|
|
}
|
|
} |