SPIGOT-4395: Additions to PlayerBedEnterEvent.

Contributions by blablubbabc as well - https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/pull-requests/383/overview

By: Ugleh <troti@ymail.com>
This commit is contained in:
Bukkit/Spigot 2018-11-02 18:31:15 +11:00
parent 66cea125d6
commit 667e7ba35e

View file

@ -9,21 +9,131 @@ import org.bukkit.event.HandlerList;
* This event is fired when the player is almost about to enter the bed.
*/
public class PlayerBedEnterEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancel = false;
private final Block bed;
public PlayerBedEnterEvent(final Player who, final Block bed) {
/**
* Represents the default possible outcomes of this event.
* @deprecated draft API
*/
@Deprecated
public enum BedEnterResult {
/**
* The player will enter the bed.
*/
OK,
/**
* The world doesn't allow sleeping (ex. Nether or The End). Entering
* the bed is prevented and the bed explodes.
*/
NOT_POSSIBLE_HERE,
/**
* Entering the bed is prevented due to it not being night nor
* thundering currently.
* <p>
* If the event is forcefully allowed during daytime, the player will
* enter the bed (and set its bed location), but might get immediately
* thrown out again.
*/
NOT_POSSIBLE_NOW,
/**
* Entering the bed is prevented due to the player being too far away.
*/
TOO_FAR_AWAY,
/**
* Entering the bed is prevented due to there being monsters nearby.
*/
NOT_SAFE,
/**
* Entering the bed is prevented due to there being some other problem.
*/
OTHER_PROBLEM;
}
private static final HandlerList handlers = new HandlerList();
private final Block bed;
private final BedEnterResult bedEnterResult;
private Result useBed = Result.DEFAULT;
public PlayerBedEnterEvent(Player who, Block bed, BedEnterResult bedEnterResult) {
super(who);
this.bed = bed;
this.bedEnterResult = bedEnterResult;
}
@Deprecated
public PlayerBedEnterEvent(Player who, Block bed) {
this(who, bed, BedEnterResult.OK);
}
/**
* This describes the default outcome of this event.
*
* @return the bed enter result representing the default outcome of this event
*/
public BedEnterResult getBedEnterResult() {
return bedEnterResult;
}
/**
* This controls the action to take with the bed that was clicked on.
* <p>
* In case of {@link Result#DEFAULT}, the default outcome is described by
* {@link #getBedEnterResult()}.
*
* @return the action to take with the interacted bed
* @see #setUseBed(Result)
*/
public Result useBed() {
return useBed;
}
/**
* Sets the action to take with the interacted bed.
* <p>
* {@link Result#ALLOW} will result in the player sleeping, regardless of
* the default outcome described by {@link #getBedEnterResult()}.
* <br>
* {@link Result#DENY} will prevent the player from sleeping. This has the
* same effect as canceling the event via {@link #setCancelled(boolean)}.
* <br>
* {@link Result#DEFAULT} will result in the outcome described by
* {@link #getBedEnterResult()}.
*
* @param useBed the action to take with the interacted bed
* @see #useBed()
*/
public void setUseBed(Result useBed) {
this.useBed = useBed;
}
/**
* Gets the cancellation state of this event. Set to true if you want to
* prevent the player from sleeping.
* <p>
* Canceling the event has the same effect as setting {@link #useBed()} to
* {@link Result#DENY}.
* <p>
* For backwards compatibility reasons this also returns true if
* {@link #useBed()} is {@link Result#DEFAULT} and the
* {@link #getBedEnterResult() default action} is to prevent bed entering.
*
* @return boolean cancellation state
*/
@Override
public boolean isCancelled() {
return cancel;
return (useBed == Result.DENY || useBed == Result.DEFAULT && bedEnterResult != BedEnterResult.OK);
}
/**
* Sets the cancellation state of this event. A canceled event will not be
* executed in the server, but will still pass to other plugins.
* <p>
* Canceling this event will prevent use of the bed.
*
* @param cancel true if you wish to cancel this event
*/
@Override
public void setCancelled(boolean cancel) {
this.cancel = cancel;
setUseBed(cancel ? Result.DENY : useBed() == Result.DENY ? Result.DEFAULT : useBed());
}
/**