Finished implementation of Incense Altar and associated blocks.

Also added the recipe for the Ritual Tinkerer, as well as the finalized book entry for the Incense Altar.
This commit is contained in:
WayofTime 2020-11-13 19:44:57 -05:00
parent 7634404dac
commit cb2db9bc50
108 changed files with 2197 additions and 81 deletions

View file

@ -0,0 +1,114 @@
package wayoftime.bloodmagic.incense;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class IncenseAltarHandler
{
public static Map<Integer, List<IncenseAltarComponent>> incenseComponentMap = new TreeMap<>();
// Incense bonus maximum applied for the tier of blocks.
public static double[] incenseBonuses = new double[] { 0.2, 0.6, 1.2, 2, 3, 4.5 };
public static double[] tranquilityRequired = new double[] { 0, 6, 14.14, 28, 44.09, 83.14 };
public static int[] roadsRequired = new int[] { 0, 1, 4, 6, 8, 10, 12 }; // TODO: Change for when the roads are
// fully implemented
public static void registerIncenseComponent(int altarLevel, IncenseAltarComponent component)
{
if (incenseComponentMap.containsKey(altarLevel))
{
incenseComponentMap.get(altarLevel).add(component);
} else
{
List<IncenseAltarComponent> list = new ArrayList<>();
list.add(component);
incenseComponentMap.put(altarLevel, list);
}
}
public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, BlockState state)
{
registerIncenseComponent(altarLevel, new IncenseAltarComponent(offsetPos, block));
}
public static double getMaxIncenseBonusFromComponents(World world, BlockPos pos)
{
double accumulatedBonus = 0;
for (int i = 0; i < incenseBonuses.length; i++)
{
double previousBonus = (i <= 0 ? 0 : incenseBonuses[i - 1]);
double nextBonus = incenseBonuses[i];
if (!incenseComponentMap.containsKey(i))
{
accumulatedBonus += (nextBonus - previousBonus);
} else
{
boolean hasAllComponentsThisTier = true;
for (IncenseAltarComponent component : incenseComponentMap.get(i))
{
BlockPos offsetPos = pos.add(component.getOffset(Direction.NORTH));
BlockState state = world.getBlockState(offsetPos);
Block block = state.getBlock();
if (component.doesBlockMatch(block))
{
hasAllComponentsThisTier = false;
} else
{
accumulatedBonus += (nextBonus - previousBonus) / incenseComponentMap.get(i).size();
}
}
if (!hasAllComponentsThisTier)
{
break;
}
}
}
return accumulatedBonus;
}
public static double getMaxIncenseBonusFromRoads(int roads)
{
double previousBonus = 0;
for (int i = 0; i < incenseBonuses.length; i++)
{
if (roads >= roadsRequired[i])
{
previousBonus = incenseBonuses[i];
} else
{
return previousBonus;
}
}
return previousBonus;
}
public static double getIncenseBonusFromComponents(World world, BlockPos pos, double tranquility, int roads)
{
double maxBonus = Math.min(getMaxIncenseBonusFromComponents(world, pos), getMaxIncenseBonusFromRoads(roads));
double possibleBonus = 0;
for (int i = 0; i < incenseBonuses.length; i++)
{
if (tranquility >= tranquilityRequired[i])
{
possibleBonus = incenseBonuses[i];
} else if (i >= 1)
{
possibleBonus += (incenseBonuses[i] - possibleBonus) * (tranquility - tranquilityRequired[i - 1]) / (tranquilityRequired[i] - tranquilityRequired[i - 1]);
break;
}
}
return Math.min(maxBonus, possibleBonus);
}
}