From 574c9958651747d26c23a406893edfbd4eab4afc Mon Sep 17 00:00:00 2001
From: WayofTime <wtime@live.ca>
Date: Sat, 23 Jan 2016 16:25:39 -0500
Subject: [PATCH] Added a bit of framework for the incense system.

---
 .../java/WayofTime/bloodmagic/BloodMagic.java |   2 +
 .../api/incense/EnumTranquilityType.java      |   8 ++
 .../bloodmagic/api/incense/IIncensePath.java  |  15 ++
 .../incense/IncenseTranquilityRegistry.java   |  33 +++++
 .../api/incense/TranquilityHandler.java       |  11 ++
 .../api/incense/TranquilityStack.java         |  13 ++
 .../incense/PlantTranquilityHandler.java      |  32 +++++
 .../incense/WaterTranquilityHandler.java      |  30 ++++
 .../registry/ModTranquilityHandlers.java      |  12 ++
 .../bloodmagic/tile/TileIncenseAltar.java     | 130 ++++++++++++++++++
 10 files changed, 286 insertions(+)
 create mode 100644 src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/api/incense/TranquilityHandler.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/incense/PlantTranquilityHandler.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/incense/WaterTranquilityHandler.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java
 create mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java

diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java
index 5314a770..93e85f28 100644
--- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java
+++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java
@@ -25,6 +25,7 @@ import WayofTime.bloodmagic.registry.ModItems;
 import WayofTime.bloodmagic.registry.ModPotions;
 import WayofTime.bloodmagic.registry.ModRecipes;
 import WayofTime.bloodmagic.registry.ModRituals;
+import WayofTime.bloodmagic.registry.ModTranquilityHandlers;
 
 @Mod(modid = Constants.Mod.MODID, name = Constants.Mod.NAME, version = Constants.Mod.VERSION, dependencies = Constants.Mod.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory")
 @Getter
@@ -69,6 +70,7 @@ public class BloodMagic
         ModEntities.init();
         ModCompatibility.registerModCompat();
         ModCompatibility.loadCompat(ICompatibility.InitializationPhase.PRE_INIT);
+        ModTranquilityHandlers.init();
 
         proxy.preInit();
     }
diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java b/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java
new file mode 100644
index 00000000..9efdc4ae
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/api/incense/EnumTranquilityType.java
@@ -0,0 +1,8 @@
+package WayofTime.bloodmagic.api.incense;
+
+public enum EnumTranquilityType
+{
+    PLANT(),
+    WATER(),
+    FIRE();
+}
diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java b/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java
new file mode 100644
index 00000000..e6071510
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/api/incense/IIncensePath.java
@@ -0,0 +1,15 @@
+package WayofTime.bloodmagic.api.incense;
+
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.util.BlockPos;
+import net.minecraft.world.World;
+
+public interface IIncensePath
+{
+    /**
+     * Goes from 0 to however far this path block can be from the altar while
+     * still functioning. 0 represents a block that can work when it is two
+     * blocks horizontally away from the altar.
+     */
+    int getLevelOfPath(World world, BlockPos pos, IBlockState state);
+}
diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java
new file mode 100644
index 00000000..322a4130
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/api/incense/IncenseTranquilityRegistry.java
@@ -0,0 +1,33 @@
+package WayofTime.bloodmagic.api.incense;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.util.BlockPos;
+import net.minecraft.world.World;
+
+public class IncenseTranquilityRegistry
+{
+    public static List<TranquilityHandler> handlerList = new ArrayList<TranquilityHandler>();
+
+    public static void registerTranquilityHandler(TranquilityHandler handler)
+    {
+        handlerList.add(handler);
+    }
+
+    public static TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state)
+    {
+        for (TranquilityHandler handler : handlerList)
+        {
+            TranquilityStack tranq = handler.getTranquilityOfBlock(world, pos, block, state);
+            if (tranq != null)
+            {
+                return tranq;
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityHandler.java
new file mode 100644
index 00000000..279663a5
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityHandler.java
@@ -0,0 +1,11 @@
+package WayofTime.bloodmagic.api.incense;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.util.BlockPos;
+import net.minecraft.world.World;
+
+public abstract class TranquilityHandler
+{
+    public abstract TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state);
+}
diff --git a/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java b/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java
new file mode 100644
index 00000000..c2855f41
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/api/incense/TranquilityStack.java
@@ -0,0 +1,13 @@
+package WayofTime.bloodmagic.api.incense;
+
+public class TranquilityStack
+{
+    public final EnumTranquilityType type;
+    public double value;
+
+    public TranquilityStack(EnumTranquilityType type, double value)
+    {
+        this.type = type;
+        this.value = value;
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/incense/PlantTranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/incense/PlantTranquilityHandler.java
new file mode 100644
index 00000000..8e4f52b7
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/incense/PlantTranquilityHandler.java
@@ -0,0 +1,32 @@
+package WayofTime.bloodmagic.incense;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLeaves;
+import net.minecraft.block.BlockLog;
+import net.minecraft.block.IGrowable;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.util.BlockPos;
+import net.minecraft.world.World;
+import net.minecraftforge.common.IPlantable;
+import WayofTime.bloodmagic.api.incense.EnumTranquilityType;
+import WayofTime.bloodmagic.api.incense.TranquilityHandler;
+import WayofTime.bloodmagic.api.incense.TranquilityStack;
+
+public class PlantTranquilityHandler extends TranquilityHandler
+{
+    @Override
+    public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state)
+    {
+        if (block instanceof IGrowable || block instanceof IPlantable)
+        {
+            return new TranquilityStack(EnumTranquilityType.PLANT, 1);
+        }
+
+        if (block instanceof BlockLog || block instanceof BlockLeaves)
+        {
+            return new TranquilityStack(EnumTranquilityType.PLANT, 0.5);
+        }
+
+        return null;
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/incense/WaterTranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/incense/WaterTranquilityHandler.java
new file mode 100644
index 00000000..59348296
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/incense/WaterTranquilityHandler.java
@@ -0,0 +1,30 @@
+package WayofTime.bloodmagic.incense;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.BlockPos;
+import net.minecraft.world.World;
+import WayofTime.bloodmagic.api.incense.EnumTranquilityType;
+import WayofTime.bloodmagic.api.incense.TranquilityHandler;
+import WayofTime.bloodmagic.api.incense.TranquilityStack;
+import WayofTime.bloodmagic.registry.ModBlocks;
+
+public class WaterTranquilityHandler extends TranquilityHandler
+{
+    @Override
+    public TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, IBlockState state)
+    {
+        if (block == Blocks.water || block == Blocks.flowing_water)
+        {
+            return new TranquilityStack(EnumTranquilityType.WATER, 1);
+        }
+
+        if (block == ModBlocks.lifeEssence)
+        {
+            return new TranquilityStack(EnumTranquilityType.WATER, 2);
+        }
+
+        return null;
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java
new file mode 100644
index 00000000..78a96d5c
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java
@@ -0,0 +1,12 @@
+package WayofTime.bloodmagic.registry;
+
+import WayofTime.bloodmagic.api.incense.IncenseTranquilityRegistry;
+import WayofTime.bloodmagic.incense.PlantTranquilityHandler;
+
+public class ModTranquilityHandlers
+{
+    public static void init()
+    {
+        IncenseTranquilityRegistry.registerTranquilityHandler(new PlantTranquilityHandler());
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java
new file mode 100644
index 00000000..ed91e047
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java
@@ -0,0 +1,130 @@
+package WayofTime.bloodmagic.tile;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.ITickable;
+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;
+
+public class TileIncenseAltar extends TileInventory implements ITickable
+{
+    public AreaDescriptor incenseArea = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11);
+    public static int maxCheckRange = 5;
+    public Map<EnumTranquilityType, Double> tranquilityMap = new HashMap<EnumTranquilityType, Double>();
+
+    public TileIncenseAltar()
+    {
+        super(1, "incenseAltar");
+    }
+
+    @Override
+    public void update()
+    {
+        AxisAlignedBB aabb = incenseArea.getAABB(getPos());
+        List<EntityPlayer> playerList = worldObj.getEntitiesWithinAABB(EntityPlayer.class, aabb);
+        if (playerList.isEmpty())
+        {
+            return;
+        }
+
+    }
+
+    public void recheckConstruction()
+    {
+        //TODO: Check the physical construction of the incense altar to determine the maximum length.
+        int maxLength = 3; //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>();
+
+        for (int currentDistance = 2; currentDistance < currentDistance + maxLength; currentDistance++)
+        {
+            boolean canFormRoad = false;
+
+            level: for (int i = -maxCheckRange + yOffset; i <= maxCheckRange + yOffset; i++)
+            {
+                BlockPos verticalPos = pos.add(0, i, 0);
+
+                canFormRoad = true;
+                for (EnumFacing horizontalFacing : EnumFacing.HORIZONTALS)
+                {
+                    BlockPos facingOffsetPos = verticalPos.offset(horizontalFacing, currentDistance);
+                    for (int j = -1; j <= 1; j++)
+                    {
+                        BlockPos offsetPos = facingOffsetPos.offset(horizontalFacing.rotateY(), j);
+                        IBlockState state = worldObj.getBlockState(offsetPos);
+                        Block block = state.getBlock();
+                        if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(worldObj, offsetPos, state) >= currentDistance - 2))
+                        {
+                            canFormRoad = false;
+                            break level;
+                        }
+                    }
+                }
+
+                if (canFormRoad)
+                {
+                    yOffset = i;
+                }
+            }
+
+            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)
+                        {
+                            break; //TODO: Can make this just set j to currentDistance to speed it up.
+                        }
+
+                        for (int y = -1 + yOffset; y <= 1 + yOffset; y++)
+                        {
+                            BlockPos offsetPos = pos.add(i, yOffset, j);
+                            IBlockState state = worldObj.getBlockState(offsetPos);
+                            Block block = state.getBlock();
+                            TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(worldObj, offsetPos, block, state);
+                            if (stack != null)
+                            {
+                                if (!tranquilityMap.containsKey(stack.type))
+                                {
+                                    tranquilityMap.put(stack.type, stack.value);
+                                } else
+                                {
+                                    tranquilityMap.put(stack.type, tranquilityMap.get(stack.type) + stack.value);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        this.tranquilityMap = tranquilityMap;
+
+        double totalTranquility = 0;
+        for (Entry<EnumTranquilityType, Double> entry : tranquilityMap.entrySet())
+        {
+            totalTranquility += entry.getValue();
+        }
+
+        if (totalTranquility <= 0)
+        {
+            return;
+        }
+
+    }
+}