Allow sleeping without bed

This commit is contained in:
Bartek Bok 2016-01-09 22:39:12 +01:00
parent accf6cf218
commit fae5ff67ed
4 changed files with 188 additions and 17 deletions

View File

@ -296,9 +296,12 @@
if (!this.field_70170_p.field_72995_K)
{
if (this.func_70608_bn() || !this.func_70089_S())
@@ -1352,7 +1440,7 @@
@@ -1350,9 +1438,9 @@
if (this.field_70170_p.func_175667_e(p_180469_1_))
this.func_70105_a(0.2F, 0.2F);
- if (this.field_70170_p.func_175667_e(p_180469_1_))
+ if (this.field_70170_p.func_175667_e(p_180469_1_) && field_70170_p.func_180495_p(p_180469_1_).func_177230_c().isBed(field_70170_p, p_180469_1_, this))
{
- EnumFacing enumfacing = (EnumFacing)this.field_70170_p.func_180495_p(p_180469_1_).func_177229_b(BlockDirectional.field_176387_N);
+ EnumFacing enumfacing = this.field_70170_p.func_180495_p(p_180469_1_).func_177230_c().getBedDirection(field_70170_p, p_180469_1_);
@ -323,12 +326,23 @@
if (blockpos == null)
{
@@ -1448,14 +1537,14 @@
@@ -1430,6 +1519,10 @@
this.func_70107_b((double)((float)blockpos.func_177958_n() + 0.5F), (double)((float)blockpos.func_177956_o() + 0.1F), (double)((float)blockpos.func_177952_p() + 0.5F));
}
+ else
+ {
+ p_70999_3_ = false;
+ }
this.field_71083_bS = false;
@@ -1448,14 +1541,14 @@
private boolean func_175143_p()
{
- return this.field_70170_p.func_180495_p(this.field_71081_bT).func_177230_c() == Blocks.field_150324_C;
+ return this.field_70170_p.func_180495_p(this.field_71081_bT).func_177230_c().isBed(field_70170_p, field_71081_bT, this);
+ return net.minecraftforge.event.ForgeEventFactory.fireSleepingLocationCheck(this, field_71081_bT);
}
public static BlockPos func_180467_a(World p_180467_0_, BlockPos p_180467_1_, boolean p_180467_2_)
@ -340,7 +354,7 @@
{
if (!p_180467_2_)
{
@@ -1470,7 +1559,7 @@
@@ -1470,16 +1563,16 @@
}
else
{
@ -349,16 +363,18 @@
}
}
@@ -1479,7 +1568,7 @@
@SideOnly(Side.CLIENT)
public float func_71051_bG()
{
if (this.field_71081_bT != null)
- if (this.field_71081_bT != null)
+ if (this.field_71081_bT != null && field_70170_p.func_180495_p(field_71081_bT).func_177230_c().isBed(field_70170_p, field_71081_bT, this))
{
- EnumFacing enumfacing = (EnumFacing)this.field_70170_p.func_180495_p(this.field_71081_bT).func_177229_b(BlockDirectional.field_176387_N);
+ EnumFacing enumfacing = this.field_70170_p.func_180495_p(this.field_71081_bT).func_177230_c().getBedDirection(field_70170_p, field_71081_bT);
switch (enumfacing)
{
@@ -1519,16 +1608,24 @@
@@ -1519,16 +1612,24 @@
public BlockPos func_180470_cg()
{
@ -385,7 +401,7 @@
if (p_180473_1_ != null)
{
this.field_71077_c = p_180473_1_;
@@ -1712,6 +1809,10 @@
@@ -1712,6 +1813,10 @@
super.func_180430_e(p_180430_1_, p_180430_2_);
}
@ -396,7 +412,7 @@
}
protected void func_71061_d_()
@@ -1735,6 +1836,7 @@
@@ -1735,6 +1840,7 @@
}
EntityList.EntityEggInfo entitylist$entityegginfo = (EntityList.EntityEggInfo)EntityList.field_75627_a.get(Integer.valueOf(EntityList.func_75619_a(p_70074_1_)));
@ -404,7 +420,7 @@
if (entitylist$entityegginfo != null)
{
@@ -1847,6 +1949,8 @@
@@ -1847,6 +1953,8 @@
{
if (p_71008_1_ != this.field_71074_e)
{
@ -413,7 +429,7 @@
this.field_71074_e = p_71008_1_;
this.field_71072_f = p_71008_2_;
@@ -1918,6 +2022,10 @@
@@ -1918,6 +2026,10 @@
this.field_181016_an = p_71049_1_.field_181016_an;
this.field_181017_ao = p_71049_1_.field_181017_ao;
this.field_181018_ap = p_71049_1_.field_181018_ap;
@ -424,7 +440,7 @@
}
else if (this.field_70170_p.func_82736_K().func_82766_b("keepInventory"))
{
@@ -1931,6 +2039,18 @@
@@ -1931,6 +2043,18 @@
this.field_175152_f = p_71049_1_.field_175152_f;
this.field_71078_a = p_71049_1_.field_71078_a;
this.func_70096_w().func_75692_b(10, Byte.valueOf(p_71049_1_.func_70096_w().func_75683_a(10)));
@ -443,7 +459,7 @@
}
protected boolean func_70041_e_()
@@ -1968,7 +2088,14 @@
@@ -1968,7 +2092,14 @@
public void func_70062_b(int p_70062_1_, ItemStack p_70062_2_)
{
@ -459,7 +475,7 @@
}
@SideOnly(Side.CLIENT)
@@ -2013,7 +2140,10 @@
@@ -2013,7 +2144,10 @@
public IChatComponent func_145748_c_()
{
@ -471,7 +487,7 @@
ichatcomponent.func_150256_b().func_150241_a(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/msg " + this.func_70005_c_() + " "));
ichatcomponent.func_150256_b().func_150209_a(this.func_174823_aP());
ichatcomponent.func_150256_b().func_179989_a(this.func_70005_c_());
@@ -2022,7 +2152,7 @@
@@ -2022,7 +2156,7 @@
public float func_70047_e()
{
@ -480,7 +496,7 @@
if (this.func_70608_bn())
{
@@ -2155,6 +2285,136 @@
@@ -2155,6 +2289,136 @@
this.field_175153_bG = p_175150_1_;
}

View File

@ -65,6 +65,7 @@ import net.minecraftforge.event.entity.player.PlayerSetSpawnEvent;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.event.entity.player.PlayerUseItemEvent;
import net.minecraftforge.event.entity.player.PlayerWakeUpEvent;
import net.minecraftforge.event.entity.player.SleepingLocationCheckEvent;
import net.minecraftforge.event.entity.player.UseHoeEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.event.world.BlockEvent.NeighborNotifyEvent;
@ -500,4 +501,17 @@ public class ForgeEventFactory
MinecraftForge.EVENT_BUS.post(event);
return event.getCapabilities().size() > 0 ? new CapabilityDispatcher(event.getCapabilities(), parent) : null;
}
public static boolean fireSleepingLocationCheck(EntityPlayer player, BlockPos sleepingLocation)
{
SleepingLocationCheckEvent evt = new SleepingLocationCheckEvent(player, sleepingLocation);
MinecraftForge.EVENT_BUS.post(evt);
Result canContinueSleep = evt.getResult();
if (canContinueSleep == Result.DEFAULT)
return player.worldObj.getBlockState(player.playerLocation).getBlock().isBed(player.worldObj, player.playerLocation, player);
else
return canContinueSleep == Result.ALLOW;
}
}

View File

@ -0,0 +1,28 @@
package net.minecraftforge.event.entity.player;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.BlockPos;
import net.minecraftforge.fml.common.eventhandler.Event.HasResult;
/**
* This event is fired when game checks, if sleeping player should be still considered "in bed".<br>
* Failing this check will cause player to wake up.<br>
*
* This event has a result. {@link HasResult}<br>
*
* setResult(ALLOW) informs game that player is still "in bed"<br>
* setResult(DEFAULT) causes game to check {@link net.minecraft.block.Block#isBed(net.minecraft.world.IBlockAccess, BlockPos, net.minecraft.entity.Entity)} instead
*/
@HasResult
public class SleepingLocationCheckEvent extends PlayerEvent
{
public final BlockPos sleepingLocation;
public SleepingLocationCheckEvent(EntityPlayer player, BlockPos sleepingLocation)
{
super(player);
this.sleepingLocation = sleepingLocation;
}
}

View File

@ -0,0 +1,113 @@
package net.minecraftforge.test;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayer.EnumStatus;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;
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.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
@Mod(modid = NoBedSleepingTest.MODID, version = NoBedSleepingTest.VERSION)
public class NoBedSleepingTest
{
public static final String MODID = "ForgeDebugNoBedSleeping";
public static final String VERSION = "1.0";
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event)
{
GameRegistry.registerItem(ItemSleepingPill.instance, ItemSleepingPill.name);
MinecraftForge.EVENT_BUS.register(new EventHandler());
}
public static class EventHandler
{
@SubscribeEvent
public void onEntityConstruct(EntityConstructing evt)
{
evt.entity.registerExtendedProperties(ExtendedPropertySleeping.name, new ExtendedPropertySleeping());
}
@SubscribeEvent
public void onBedCheck(SleepingLocationCheckEvent evt)
{
final IExtendedEntityProperties property = evt.entityPlayer.getExtendedProperties(ExtendedPropertySleeping.name);
if (property instanceof ExtendedPropertySleeping && ((ExtendedPropertySleeping) property).isSleeping)
evt.setResult(Result.ALLOW);
}
@SubscribeEvent
public void onWakeUp(PlayerWakeUpEvent evt)
{
final IExtendedEntityProperties property = evt.entityPlayer.getExtendedProperties(ExtendedPropertySleeping.name);
if (property instanceof ExtendedPropertySleeping)
((ExtendedPropertySleeping) property).isSleeping = false;
}
}
public static class ExtendedPropertySleeping implements IExtendedEntityProperties
{
private static final String TAG_NAME = "IsSleepingExt";
public static final String name = "is_sleeping";
public boolean isSleeping;
@Override
public void saveNBTData(NBTTagCompound compound)
{
compound.setBoolean(TAG_NAME, isSleeping);
}
@Override
public void loadNBTData(NBTTagCompound compound)
{
this.isSleeping = compound.getBoolean(TAG_NAME);
}
@Override
public void init(Entity entity, World world)
{
}
}
public static class ItemSleepingPill extends Item
{
public static final ItemSleepingPill instance = new ItemSleepingPill();
public static final String name = "sleeping_pill";
private ItemSleepingPill()
{
setCreativeTab(CreativeTabs.tabMisc);
setUnlocalizedName(MODID + ":" + name);
}
public ItemStack onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn)
{
if (!worldIn.isRemote)
{
final EnumStatus result = playerIn.trySleep(playerIn.getPosition());
if (result == EnumStatus.OK)
{
final IExtendedEntityProperties property = playerIn.getExtendedProperties(ExtendedPropertySleeping.name);
if (property instanceof ExtendedPropertySleeping)
((ExtendedPropertySleeping) property).isSleeping = true;
}
}
return itemStackIn;
}
}
}