diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java new file mode 100644 index 00000000..9b5e9e25 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/CapabilityRuneType.java @@ -0,0 +1,59 @@ +package WayofTime.bloodmagic.api.ritual; + +import WayofTime.bloodmagic.api.ritual.EnumRuneType; +import WayofTime.bloodmagic.api.ritual.IRitualStone; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; + +import java.util.concurrent.Callable; + +public final class CapabilityRuneType +{ + public static class RuneTypeStorage implements Capability.IStorage + { + @Override + public NBTBase writeNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side) + { + return new NBTTagByte((byte)instance.getRuneType().ordinal()); + } + + @Override + public void readNBT(Capability capability, IRitualStone.Tile instance, EnumFacing side, NBTBase nbt) + { + instance.setRuneType(EnumRuneType.byMetadata(((NBTTagByte)nbt).getByte())); + } + } + + public static class RuneTypeWrapper implements IRitualStone.Tile + { + private EnumRuneType type = EnumRuneType.BLANK; + + @Override + public boolean isRuneType(EnumRuneType runeType) + { + return type == runeType; + } + + @Override + public EnumRuneType getRuneType() + { + return type; + } + + public void setRuneType(EnumRuneType runeType) + { + type = runeType; + } + } + + public static class Factory implements Callable + { + @Override + public IRitualStone.Tile call() throws Exception + { + return new RuneTypeWrapper(); + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java b/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java index e00886ac..223a47db 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/IRitualStone.java @@ -12,8 +12,14 @@ public interface IRitualStone { boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType); + void setRuneType(World world, BlockPos pos, EnumRuneType runeType); + interface Tile { boolean isRuneType(EnumRuneType runeType); + + EnumRuneType getRuneType(); + + void setRuneType(EnumRuneType runeType); } } diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java index 8b47d48a..3b9bef22 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/RitualHelper.java @@ -2,8 +2,10 @@ package WayofTime.bloodmagic.api.util.helper; import java.util.ArrayList; +import WayofTime.bloodmagic.api.ritual.EnumRuneType; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; @@ -11,9 +13,14 @@ import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; public class RitualHelper { + @CapabilityInject(IRitualStone.Tile.class) + static Capability RUNE_CAPABILITY = null; + public static boolean canCrystalActivate(Ritual ritual, int crystalLevel) { return ritual.getCrystalLevel() <= crystalLevel && RitualRegistry.ritualEnabled(ritual); @@ -93,14 +100,9 @@ public class RitualHelper for (RitualComponent component : components) { BlockPos newPos = pos.add(component.getOffset(direction)); - IBlockState worldState = world.getBlockState(newPos); - Block block = worldState.getBlock(); - if (block instanceof IRitualStone) + if (isRuneType(world, newPos, component.getRuneType())) { - if (!((IRitualStone) block).isRuneType(world, newPos, component.getRuneType())) - { - return false; - } + continue; } else { return false; @@ -109,4 +111,56 @@ public class RitualHelper return true; } + + public static boolean isRuneType(World world, BlockPos pos, EnumRuneType type) + { + if (world == null) + return false; + Block block = world.getBlockState(pos).getBlock(); + TileEntity tile = world.getTileEntity(pos); + + if (block instanceof IRitualStone) + return ((IRitualStone) block).isRuneType(world, pos, type); + else if(tile instanceof IRitualStone.Tile) + return ((IRitualStone.Tile) tile).isRuneType(type); + else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) + return tile.getCapability(RUNE_CAPABILITY, null).isRuneType(type); + + return false; + } + + public static boolean isRune(World world, BlockPos pos) + { + if (world == null) + return false; + Block block = world.getBlockState(pos).getBlock(); + TileEntity tile = world.getTileEntity(pos); + + if (block instanceof IRitualStone) + return true; + else if(tile instanceof IRitualStone.Tile) + return true; + else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) + return true; + + return false; + } + + public static void setRuneType(World world, BlockPos pos, EnumRuneType type) + { + if (world == null) + return; + Block block = world.getBlockState(pos).getBlock(); + TileEntity tile = world.getTileEntity(pos); + + if (block instanceof IRitualStone) + ((IRitualStone) block).setRuneType(world, pos, type); + else if(tile instanceof IRitualStone.Tile) + ((IRitualStone.Tile) tile).setRuneType(type); + else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) + { + tile.getCapability(RUNE_CAPABILITY, null).setRuneType(type); + world.notifyBlockOfStateChange(pos, block); + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java index 29b45244..6988993f 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.block.base.BlockString; +import WayofTime.bloodmagic.registry.ModBlocks; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.util.BlockPos; @@ -38,4 +39,12 @@ public class BlockRitualStone extends BlockString implements IRitualStone { return runeType.toString().equals(names[getMetaFromState(world.getBlockState(pos))]); } + + @Override + public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) + { + int meta = runeType.ordinal(); + IBlockState newState = ModBlocks.ritualStone.getStateFromMeta(meta); + world.setBlockState(pos, newState); + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java index b4bfa3e2..84cde49f 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java @@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.api.util.helper.RitualHelper; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; @@ -26,7 +27,6 @@ import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.ritual.EnumRuneType; -import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.registry.ModBlocks; @@ -111,18 +111,15 @@ public class ItemRitualDiviner extends Item BlockPos newPos = pos.add(offset); IBlockState state = world.getBlockState(newPos); Block block = state.getBlock(); - if (block instanceof IRitualStone) - { // TODO: Check tile - // entity as well. - if (((IRitualStone) block).isRuneType(world, newPos, component.getRuneType())) + if (RitualHelper.isRune(world, newPos)) + { + if (RitualHelper.isRuneType(world, newPos, component.getRuneType())) { continue; } else { // Replace existing ritual stone - int meta = component.getRuneType().ordinal(); - IBlockState newState = ModBlocks.ritualStone.getStateFromMeta(meta); - world.setBlockState(newPos, newState); + RitualHelper.setRuneType(world, newPos, component.getRuneType()); return true; } } else if (block.isAir(world, newPos)) diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java index 736347c6..e24d8b84 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java @@ -1,11 +1,14 @@ package WayofTime.bloodmagic.proxy; +import WayofTime.bloodmagic.api.ritual.CapabilityRuneType; +import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.teleport.TeleportQueue; import WayofTime.bloodmagic.util.handler.EventHandler; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.CapabilityManager; public class CommonProxy { @@ -29,7 +32,7 @@ public class CommonProxy public void init() { - + CapabilityManager.INSTANCE.register(IRitualStone.Tile.class, new CapabilityRuneType.RuneTypeStorage(), new CapabilityRuneType.Factory()); } public void postInit()