Merge pull request #641 from Alex-hawks/1.8

Add Capability support to Ritual Sones, Finish TE support as well
This commit is contained in:
Nick Ignoffo 2016-02-23 21:33:55 -08:00
commit 5c5cda1917
6 changed files with 144 additions and 16 deletions

View file

@ -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<IRitualStone.Tile>
{
@Override
public NBTBase writeNBT(Capability<IRitualStone.Tile> capability, IRitualStone.Tile instance, EnumFacing side)
{
return new NBTTagByte((byte)instance.getRuneType().ordinal());
}
@Override
public void readNBT(Capability<IRitualStone.Tile> 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<IRitualStone.Tile>
{
@Override
public IRitualStone.Tile call() throws Exception
{
return new RuneTypeWrapper();
}
}
}

View file

@ -12,8 +12,14 @@ public interface IRitualStone
{ {
boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType); boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType);
void setRuneType(World world, BlockPos pos, EnumRuneType runeType);
interface Tile interface Tile
{ {
boolean isRuneType(EnumRuneType runeType); boolean isRuneType(EnumRuneType runeType);
EnumRuneType getRuneType();
void setRuneType(EnumRuneType runeType);
} }
} }

View file

@ -2,8 +2,10 @@ package WayofTime.bloodmagic.api.util.helper;
import java.util.ArrayList; import java.util.ArrayList;
import WayofTime.bloodmagic.api.ritual.EnumRuneType;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos; import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.world.World; 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.IRitualStone;
import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.Ritual;
import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.ritual.RitualComponent;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
public class RitualHelper public class RitualHelper
{ {
@CapabilityInject(IRitualStone.Tile.class)
static Capability<IRitualStone.Tile> RUNE_CAPABILITY = null;
public static boolean canCrystalActivate(Ritual ritual, int crystalLevel) public static boolean canCrystalActivate(Ritual ritual, int crystalLevel)
{ {
return ritual.getCrystalLevel() <= crystalLevel && RitualRegistry.ritualEnabled(ritual); return ritual.getCrystalLevel() <= crystalLevel && RitualRegistry.ritualEnabled(ritual);
@ -93,14 +100,9 @@ public class RitualHelper
for (RitualComponent component : components) for (RitualComponent component : components)
{ {
BlockPos newPos = pos.add(component.getOffset(direction)); BlockPos newPos = pos.add(component.getOffset(direction));
IBlockState worldState = world.getBlockState(newPos); if (isRuneType(world, newPos, component.getRuneType()))
Block block = worldState.getBlock();
if (block instanceof IRitualStone)
{ {
if (!((IRitualStone) block).isRuneType(world, newPos, component.getRuneType())) continue;
{
return false;
}
} else } else
{ {
return false; return false;
@ -109,4 +111,56 @@ public class RitualHelper
return true; 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);
}
}
} }

View file

@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.EnumRuneType;
import WayofTime.bloodmagic.api.ritual.IRitualStone; import WayofTime.bloodmagic.api.ritual.IRitualStone;
import WayofTime.bloodmagic.block.base.BlockString; import WayofTime.bloodmagic.block.base.BlockString;
import WayofTime.bloodmagic.registry.ModBlocks;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.util.BlockPos; 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))]); 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);
}
} }

View file

@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import WayofTime.bloodmagic.api.util.helper.RitualHelper;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@ -26,7 +27,6 @@ import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.registry.RitualRegistry; import WayofTime.bloodmagic.api.registry.RitualRegistry;
import WayofTime.bloodmagic.api.ritual.EnumRuneType; import WayofTime.bloodmagic.api.ritual.EnumRuneType;
import WayofTime.bloodmagic.api.ritual.IRitualStone;
import WayofTime.bloodmagic.api.ritual.Ritual; import WayofTime.bloodmagic.api.ritual.Ritual;
import WayofTime.bloodmagic.api.ritual.RitualComponent; import WayofTime.bloodmagic.api.ritual.RitualComponent;
import WayofTime.bloodmagic.registry.ModBlocks; import WayofTime.bloodmagic.registry.ModBlocks;
@ -111,18 +111,15 @@ public class ItemRitualDiviner extends Item
BlockPos newPos = pos.add(offset); BlockPos newPos = pos.add(offset);
IBlockState state = world.getBlockState(newPos); IBlockState state = world.getBlockState(newPos);
Block block = state.getBlock(); Block block = state.getBlock();
if (block instanceof IRitualStone) if (RitualHelper.isRune(world, newPos))
{ // TODO: Check tile {
// entity as well. if (RitualHelper.isRuneType(world, newPos, component.getRuneType()))
if (((IRitualStone) block).isRuneType(world, newPos, component.getRuneType()))
{ {
continue; continue;
} else } else
{ {
// Replace existing ritual stone // Replace existing ritual stone
int meta = component.getRuneType().ordinal(); RitualHelper.setRuneType(world, newPos, component.getRuneType());
IBlockState newState = ModBlocks.ritualStone.getStateFromMeta(meta);
world.setBlockState(newPos, newState);
return true; return true;
} }
} else if (block.isAir(world, newPos)) } else if (block.isAir(world, newPos))

View file

@ -1,11 +1,14 @@
package WayofTime.bloodmagic.proxy; 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.api.teleport.TeleportQueue;
import WayofTime.bloodmagic.util.handler.EventHandler; import WayofTime.bloodmagic.util.handler.EventHandler;
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.CapabilityManager;
public class CommonProxy public class CommonProxy
{ {
@ -29,7 +32,7 @@ public class CommonProxy
public void init() public void init()
{ {
CapabilityManager.INSTANCE.register(IRitualStone.Tile.class, new CapabilityRuneType.RuneTypeStorage(), new CapabilityRuneType.Factory());
} }
public void postInit() public void postInit()