Add a WorldProvider#canSleepHere() method to allow providers to control sleeping in beds separately from re-spawning. (#4741)
This commit is contained in:
parent
7c098462fe
commit
e82a7605dc
3 changed files with 84 additions and 1 deletions
14
patches/minecraft/net/minecraft/block/BlockBed.java.patch
Normal file
14
patches/minecraft/net/minecraft/block/BlockBed.java.patch
Normal file
|
@ -0,0 +1,14 @@
|
|||
--- ../src-base/minecraft/net/minecraft/block/BlockBed.java
|
||||
+++ ../src-work/minecraft/net/minecraft/block/BlockBed.java
|
||||
@@ -84,8 +84,10 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (p_180639_1_.field_73011_w.func_76567_e() && p_180639_1_.func_180494_b(p_180639_2_) != Biomes.field_76778_j)
|
||||
+ net.minecraft.world.WorldProvider.WorldSleepResult sleepResult = p_180639_1_.field_73011_w.canSleepAt(p_180639_4_, p_180639_2_);
|
||||
+ if (sleepResult != net.minecraft.world.WorldProvider.WorldSleepResult.BED_EXPLODES)
|
||||
{
|
||||
+ if (sleepResult == net.minecraft.world.WorldProvider.WorldSleepResult.DENY) return true;
|
||||
if (((Boolean)p_180639_3_.func_177229_b(field_176471_b)).booleanValue())
|
||||
{
|
||||
EntityPlayer entityplayer = this.func_176470_e(p_180639_1_, p_180639_2_);
|
|
@ -65,7 +65,7 @@
|
|||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@@ -241,6 +216,352 @@
|
||||
@@ -241,6 +216,371 @@
|
||||
return new WorldBorder();
|
||||
}
|
||||
|
||||
|
@ -256,6 +256,25 @@
|
|||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ /**
|
||||
+ * Determines if the player can sleep in this world (or if the bed should explode for example).
|
||||
+ *
|
||||
+ * @param player The player that is attempting to sleep
|
||||
+ * @param pos The location where the player tries to sleep at (the position of the clicked on bed for example)
|
||||
+ * @return the result of a player trying to sleep at the given location
|
||||
+ */
|
||||
+ public WorldSleepResult canSleepAt(net.minecraft.entity.player.EntityPlayer player, BlockPos pos)
|
||||
+ {
|
||||
+ return (this.func_76567_e() && this.field_76579_a.func_180494_b(pos) != net.minecraft.init.Biomes.field_76778_j) ? WorldSleepResult.ALLOW : WorldSleepResult.BED_EXPLODES;
|
||||
+ }
|
||||
+
|
||||
+ public static enum WorldSleepResult
|
||||
+ {
|
||||
+ ALLOW,
|
||||
+ DENY,
|
||||
+ BED_EXPLODES;
|
||||
+ }
|
||||
+
|
||||
+ /*======================================= Start Moved From World =========================================*/
|
||||
+
|
||||
+ public Biome getBiomeForCoords(BlockPos pos)
|
||||
|
|
50
src/test/java/net/minecraftforge/debug/CanSleepAtTest.java
Normal file
50
src/test/java/net/minecraftforge/debug/CanSleepAtTest.java
Normal file
|
@ -0,0 +1,50 @@
|
|||
package net.minecraftforge.debug;
|
||||
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.DimensionType;
|
||||
import net.minecraft.world.WorldProvider;
|
||||
import net.minecraftforge.common.DimensionManager;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventHandler;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
|
||||
@Mod(modid = CanSleepAtTest.MODID, name = "CanSleepAtTest", version = "0.0.0", acceptableRemoteVersions = "*")
|
||||
public class CanSleepAtTest
|
||||
{
|
||||
public static final String MODID = "can_sleep_at_test";
|
||||
public static final boolean ENABLED = false;
|
||||
public static DimensionType dimType = null;
|
||||
public static int dimId;
|
||||
private static Logger logger;
|
||||
|
||||
@EventHandler
|
||||
public void onPreInit(FMLPreInitializationEvent event)
|
||||
{
|
||||
if (ENABLED)
|
||||
{
|
||||
logger = event.getModLog();
|
||||
dimId = DimensionManager.getNextFreeDimId();
|
||||
dimType = DimensionType.register("CanSleepAtTest", "_cansleepattest", dimId, WorldProviderTest.class, false);
|
||||
DimensionManager.registerDimension(dimId, dimType);
|
||||
logger.info("Registered CanSleepAtTest dimension as DIM {}", dimId);
|
||||
}
|
||||
}
|
||||
|
||||
public static class WorldProviderTest extends WorldProvider
|
||||
{
|
||||
@Override
|
||||
public DimensionType getDimensionType()
|
||||
{
|
||||
return CanSleepAtTest.dimType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorldSleepResult canSleepAt(EntityPlayer player, BlockPos pos)
|
||||
{
|
||||
// Creates a 5x5 blocks wide grid of the different sleep results
|
||||
return WorldSleepResult.values()[((pos.getX() / 5) + (pos.getZ() / 5)) % WorldSleepResult.values().length];
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue