package net.minecraftforge.test;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayer.SleepResult;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTPrimitive;
import net.minecraft.nbt.NBTTagByte;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.capabilities.Capability.IStorage;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.entity.player.PlayerWakeUpEvent;
import net.minecraftforge.event.entity.player.SleepingLocationCheckEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@Mod(modid = NoBedSleepingTest.MODID, name = "ForgeDebugNoBedSleeping", version = NoBedSleepingTest.VERSION, acceptableRemoteVersions = "*")
public class NoBedSleepingTest
{
public static final String MODID = "forgedebugnobedsleeping";
public static final String VERSION = "1.0";
@CapabilityInject(IExtraSleeping.class)
private static final Capability<IExtraSleeping> SLEEP_CAP = null;
@SidedProxy
public static CommonProxy proxy = null;
public static abstract class CommonProxy
{
public void preInit(FMLPreInitializationEvent event)
{
GameRegistry.register(ItemSleepingPill.instance);
CapabilityManager.INSTANCE.register(IExtraSleeping.class, new Storage(), DefaultImpl.class);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
}
public static final class ServerProxy extends CommonProxy {}
public static final class ClientProxy extends CommonProxy
{
@Override
public void preInit(FMLPreInitializationEvent event)
{
super.preInit(event);
ModelLoader.setCustomModelResourceLocation(ItemSleepingPill.instance, 0, new ModelResourceLocation(new ResourceLocation(MODID, ItemSleepingPill.name), "inventory"));
}
}
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event)
{
proxy.preInit(event);
}
public static class EventHandler
{
@SubscribeEvent
public void onEntityConstruct(AttachCapabilitiesEvent.Entity evt)
{
if (!(evt.getEntity() instanceof EntityPlayer))
return;
evt.addCapability(new ResourceLocation(MODID, "IExtraSleeping"), new ICapabilitySerializable<NBTPrimitive>()
{
IExtraSleeping inst = SLEEP_CAP.getDefaultInstance();
@Override
public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing) {
return capability == SLEEP_CAP;
}
@Override
@Nullable
public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
return capability == SLEEP_CAP ? SLEEP_CAP.<T>cast(inst) : null;
}
@Override
public NBTPrimitive serializeNBT() {
return (NBTPrimitive)SLEEP_CAP.getStorage().writeNBT(SLEEP_CAP, inst, null);
}
@Override
public void deserializeNBT(NBTPrimitive nbt) {
SLEEP_CAP.getStorage().readNBT(SLEEP_CAP, inst, null, nbt);
}
});
}
@SubscribeEvent
public void onBedCheck(SleepingLocationCheckEvent evt)
{
final IExtraSleeping sleep = evt.getEntityPlayer().getCapability(SLEEP_CAP, null);
if (sleep != null && sleep.isSleeping())
evt.setResult(Result.ALLOW);
}
@SubscribeEvent
public void onWakeUp(PlayerWakeUpEvent evt)
{
final IExtraSleeping sleep = evt.getEntityPlayer().getCapability(SLEEP_CAP, null);
if (sleep != null)
sleep.setSleeping(false);
}
}
public interface IExtraSleeping {
boolean isSleeping();
void setSleeping(boolean value);
}
public static class Storage implements IStorage<IExtraSleeping>
{
@Override
public NBTBase writeNBT(Capability<IExtraSleeping> capability, IExtraSleeping instance, EnumFacing side)
{
return new NBTTagByte((byte)(instance.isSleeping() ? 1 : 0));
}
@Override
public void readNBT(Capability<IExtraSleeping> capability, IExtraSleeping instance, EnumFacing side, NBTBase nbt)
{
instance.setSleeping(((NBTPrimitive)nbt).getByte() == 1);
}
}
public static class DefaultImpl implements IExtraSleeping
{
private boolean isSleeping = false;
@Override public boolean isSleeping() { return isSleeping; }
@Override public void setSleeping(boolean value) { this.isSleeping = value; }
}
public static class ItemSleepingPill extends Item
{
public static final ItemSleepingPill instance = new ItemSleepingPill();
public static final String name = "sleeping_pill";
private ItemSleepingPill()
{
setCreativeTab(CreativeTabs.MISC);
setUnlocalizedName(MODID + ":" + name);
setRegistryName(new ResourceLocation(MODID, name));
}
@Override
@Nonnull
public ActionResult<ItemStack> onItemRightClick(@Nonnull World world, @Nonnull EntityPlayer player, @Nonnull EnumHand hand)
{
ItemStack stack = player.getHeldItem(hand);
if (!world.isRemote)
{
final SleepResult result = player.trySleep(player.getPosition());
if (result == SleepResult.OK)
{
final IExtraSleeping sleep = player.getCapability(SLEEP_CAP, null);
if (sleep != null)
sleep.setSleeping(true);
return ActionResult.newResult(EnumActionResult.SUCCESS, stack);
}
}
return ActionResult.newResult(EnumActionResult.PASS, stack);
}
}
}