BloodMagic/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java

165 lines
6.7 KiB
Java
Raw Normal View History

package WayofTime.bloodmagic.tile;
import WayofTime.bloodmagic.api.incense.EnumTranquilityType;
import WayofTime.bloodmagic.api.incense.IIncensePath;
import WayofTime.bloodmagic.api.incense.IncenseTranquilityRegistry;
import WayofTime.bloodmagic.api.incense.TranquilityStack;
import WayofTime.bloodmagic.api.ritual.AreaDescriptor;
import WayofTime.bloodmagic.api.util.helper.PlayerSacrificeHelper;
import WayofTime.bloodmagic.incense.IncenseAltarHandler;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
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 java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
2017-08-15 21:30:48 -07:00
public class TileIncenseAltar extends TileInventory implements ITickable {
public static int maxCheckRange = 5;
2017-08-15 21:30:48 -07:00
public AreaDescriptor incenseArea = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11);
public Map<EnumTranquilityType, Double> tranquilityMap = new HashMap<EnumTranquilityType, Double>();
public double incenseAddition = 0; //Self-sacrifice is multiplied by 1 plus this value.
public double tranquility = 0;
public int roadDistance = 0; //Number of road blocks laid down
2017-08-15 21:30:48 -07:00
public TileIncenseAltar() {
super(1, "incenseAltar");
}
@Override
2017-08-15 21:30:48 -07:00
public void update() {
AxisAlignedBB aabb = incenseArea.getAABB(getPos());
2016-12-12 19:56:36 -08:00
List<EntityPlayer> playerList = getWorld().getEntitiesWithinAABB(EntityPlayer.class, aabb);
2017-08-15 21:30:48 -07:00
if (playerList.isEmpty()) {
return;
}
2017-08-15 21:30:48 -07:00
if (getWorld().getTotalWorldTime() % 100 == 0) {
recheckConstruction();
}
boolean hasPerformed = false;
2017-08-15 21:30:48 -07:00
for (EntityPlayer player : playerList) {
if (PlayerSacrificeHelper.incrementIncense(player, 0, incenseAddition, incenseAddition / 100)) {
hasPerformed = true;
}
}
2017-08-15 21:30:48 -07:00
if (hasPerformed) {
if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof WorldServer) {
2016-12-12 19:56:36 -08:00
WorldServer server = (WorldServer) getWorld();
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
2017-08-15 21:30:48 -07:00
public void deserialize(NBTTagCompound tag) {
super.deserialize(tag);
tranquility = tag.getDouble("tranquility");
incenseAddition = tag.getDouble("incenseAddition");
}
@Override
2017-08-15 21:30:48 -07:00
public NBTTagCompound serialize(NBTTagCompound tag) {
super.serialize(tag);
tag.setDouble("tranquility", tranquility);
tag.setDouble("incenseAddition", incenseAddition);
return tag;
}
2017-08-15 21:30:48 -07:00
public void recheckConstruction() {
//TODO: Check the physical construction of the incense altar to determine the maximum length.
int maxLength = 11; //Max length of the path. The path starts two blocks away from the center block.
int yOffset = 0;
Map<EnumTranquilityType, Double> tranquilityMap = new HashMap<EnumTranquilityType, Double>();
2017-08-15 21:30:48 -07:00
for (int currentDistance = 2; currentDistance < currentDistance + maxLength; currentDistance++) {
boolean canFormRoad = false;
2017-08-15 21:30:48 -07:00
for (int i = -maxCheckRange + yOffset; i <= maxCheckRange + yOffset; i++) {
BlockPos verticalPos = pos.add(0, i, 0);
canFormRoad = true;
2017-08-15 21:30:48 -07:00
level:
for (EnumFacing horizontalFacing : EnumFacing.HORIZONTALS) {
BlockPos facingOffsetPos = verticalPos.offset(horizontalFacing, currentDistance);
2017-08-15 21:30:48 -07:00
for (int j = -1; j <= 1; j++) {
BlockPos offsetPos = facingOffsetPos.offset(horizontalFacing.rotateY(), j);
2016-12-12 19:56:36 -08:00
IBlockState state = getWorld().getBlockState(offsetPos);
Block block = state.getBlock();
2017-08-15 21:30:48 -07:00
if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2)) {
canFormRoad = false;
break level;
}
}
}
2017-08-15 21:30:48 -07:00
if (canFormRoad) {
yOffset = i;
break;
}
}
2017-08-15 21:30:48 -07:00
if (canFormRoad) {
for (int i = -currentDistance; i <= currentDistance; i++) {
for (int j = -currentDistance; j <= currentDistance; j++) {
if (Math.abs(i) != currentDistance && Math.abs(j) != currentDistance) {
2016-08-26 20:57:32 -04:00
continue; //TODO: Can make this just set j to currentDistance to speed it up.
}
2017-08-15 21:30:48 -07:00
for (int y = 0 + yOffset; y <= 2 + yOffset; y++) {
BlockPos offsetPos = pos.add(i, y, j);
2016-12-12 19:56:36 -08:00
IBlockState state = getWorld().getBlockState(offsetPos);
Block block = state.getBlock();
2016-12-12 19:56:36 -08:00
TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(getWorld(), offsetPos, block, state);
2017-08-15 21:30:48 -07:00
if (stack != null) {
if (!tranquilityMap.containsKey(stack.type)) {
tranquilityMap.put(stack.type, stack.value);
2017-08-15 21:30:48 -07:00
} else {
tranquilityMap.put(stack.type, tranquilityMap.get(stack.type) + stack.value);
}
}
}
}
}
2017-08-15 21:30:48 -07:00
} else {
roadDistance = currentDistance - 2;
break;
}
}
this.tranquilityMap = tranquilityMap;
double totalTranquility = 0;
2017-08-15 21:30:48 -07:00
for (Entry<EnumTranquilityType, Double> entry : tranquilityMap.entrySet()) {
totalTranquility += entry.getValue();
}
2017-08-15 21:30:48 -07:00
if (totalTranquility < 0) {
return;
}
double appliedTranquility = 0;
2017-08-15 21:30:48 -07:00
for (Entry<EnumTranquilityType, Double> entry : tranquilityMap.entrySet()) {
appliedTranquility += Math.sqrt(entry.getValue());
}
2016-12-12 19:56:36 -08:00
double bonus = IncenseAltarHandler.getIncenseBonusFromComponents(getWorld(), pos, appliedTranquility, roadDistance);
incenseAddition = bonus;
this.tranquility = appliedTranquility;
}
}