package choonster.testmod3.capability.lock;
import choonster.testmod3.TestMod3;
import choonster.testmod3.api.capability.lock.ILock;
import choonster.testmod3.capability.lock.wrapper.LockableContainerWrapper;
import net.minecraft.block.state.IBlockState;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.ILockableContainer;
import net.minecraft.world.LockCode;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.CapabilityManager;
import javax.annotation.Nullable;
/**
* Capability for {@link ILock}.
*
* @author Choonster
*/
public final class CapabilityLock {
/**
* The {@link Capability} instance.
*/
@CapabilityInject(ILock.class)
public static final Capability<ILock> LOCK_CAPABILITY = null;
/**
* The ID of this capability.
*/
public static final ResourceLocation ID = new ResourceLocation(TestMod3.MODID, "lock");
public static void register() {
CapabilityManager.INSTANCE.register(ILock.class, new Capability.IStorage<ILock>() {
@Override
public NBTBase writeNBT(final Capability<ILock> capability, final ILock instance, final EnumFacing side) {
final NBTTagCompound tagCompound = new NBTTagCompound();
final LockCode lockCode = instance.getLockCode();
lockCode.toNBT(tagCompound);
if (instance.hasCustomName()) {
tagCompound.setString("DisplayName", ITextComponent.Serializer.componentToJson(instance.getDisplayName()));
}
return tagCompound;
}
@Override
public void readNBT(final Capability<ILock> capability, final ILock instance, final EnumFacing side, final NBTBase nbt) {
if (!(instance instanceof Lock))
throw new RuntimeException("Can not deserialise to an instance that isn't the default implementation");
final Lock lock = (Lock) instance;
final NBTTagCompound tagCompound = (NBTTagCompound) nbt;
lock.setLockCode(LockCode.fromNBT(tagCompound));
if (tagCompound.hasKey("DisplayName")) {
lock.setDisplayName(ITextComponent.Serializer.jsonToComponent(tagCompound.getString("DisplayName")));
}
}
}, () -> new Lock(new TextComponentTranslation("container.inventory")));
}
/**
* Get the {@link ILock} from a block.
*
* @param world The world
* @param pos The position
* @param side The side
* @return The ILock, or null if there isn't one.
*/
@Nullable
public static ILock getLock(IBlockAccess world, BlockPos pos, @Nullable EnumFacing side) {
final IBlockState state = world.getBlockState(pos);
if (state.getBlock().hasTileEntity(state)) {
final TileEntity tileEntity = world.getTileEntity(pos);
if (tileEntity != null) {
if (tileEntity.hasCapability(LOCK_CAPABILITY, side)) {
return tileEntity.getCapability(LOCK_CAPABILITY, side);
} else if (tileEntity instanceof ILockableContainer) {
return new LockableContainerWrapper((ILockableContainer) tileEntity);
}
}
}
return null;
}
}