diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 0ab1fb945..1d8755b4c 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -39,6 +39,8 @@ use pocketmine\event\inventory\InventoryCloseEvent; use pocketmine\event\inventory\InventoryPickupItemEvent; use pocketmine\event\player\PlayerAchievementAwardedEvent; use pocketmine\event\player\PlayerAnimationEvent; +use pocketmine\event\player\PlayerBedEnterEvent; +use pocketmine\event\player\PlayerBedLeaveEvent; use pocketmine\event\player\PlayerChatEvent; use pocketmine\event\player\PlayerCommandPreprocessEvent; use pocketmine\event\player\PlayerDeathEvent; @@ -825,6 +827,12 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } } } + + $this->server->getPluginManager()->callEvent($ev = new PlayerBedEnterEvent($this, $this->getLevel()->getBlock($pos))); + if($ev->isCancelled()){ + return false; + } + $this->sleeping = $pos; $this->teleport(new Position($pos->x + 0.5, $pos->y + 1, $pos->z + 0.5, $this->getLevel())); @@ -858,10 +866,15 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } public function stopSleep(){ - $this->sleeping = false; + if($this->sleeping instanceof Vector3){ + $this->server->getPluginManager()->callEvent($ev = new PlayerBedLeaveEvent($this, $this->getLevel()->getBlock($pos))); + + $this->sleeping = null; + + $this->sendMetadata($this->getViewers()); + $this->sendMetadata($this); + } - $this->sendMetadata($this->getViewers()); - $this->sendMetadata($this); } /** @@ -869,7 +882,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ * Changes to this function won't be recorded on the version. */ public function checkSleep(){ - if($this->sleeping !== false){ + if($this->sleeping instanceof Vector3){ //TODO: Move to Level $time = $this->getLevel()->getTime() % Level::TIME_FULL; @@ -2492,7 +2505,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ ]; - if($this->sleeping !== false){ + if($this->sleeping instanceof Vector3){ $d[16]["value"] = 2; $d[17]["value"] = [$this->sleeping->x, $this->sleeping->y, $this->sleeping->z]; } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index c2ed25748..66f8f3c59 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -33,6 +33,7 @@ use pocketmine\event\entity\EntityMoveEvent; use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\event\entity\EntitySpawnEvent; use pocketmine\event\entity\EntityTeleportEvent; +use pocketmine\event\player\PlayerMotionEvent; use pocketmine\event\Timings; use pocketmine\level\format\Chunk; use pocketmine\level\format\FullChunk; @@ -1100,9 +1101,11 @@ abstract class Entity extends Position implements Metadatable{ return false; } } + $this->motionX = $motion->x; $this->motionY = $motion->y; $this->motionZ = $motion->z; + if(!$this->justCreated){ if($this instanceof Player){ $pk = new SetEntityMotionPacket; diff --git a/src/pocketmine/event/player/PlayerBedEnterEvent.php b/src/pocketmine/event/player/PlayerBedEnterEvent.php new file mode 100644 index 000000000..4faf04248 --- /dev/null +++ b/src/pocketmine/event/player/PlayerBedEnterEvent.php @@ -0,0 +1,42 @@ +player = $player; + $this->bed = $bed; + } + + public function getBed(){ + return $this->bed; + } + +} \ No newline at end of file diff --git a/src/pocketmine/event/player/PlayerBedLeaveEvent.php b/src/pocketmine/event/player/PlayerBedLeaveEvent.php new file mode 100644 index 000000000..80d8cb124 --- /dev/null +++ b/src/pocketmine/event/player/PlayerBedLeaveEvent.php @@ -0,0 +1,41 @@ +player = $player; + $this->bed = $bed; + } + + public function getBed(){ + return $this->bed; + } + +} \ No newline at end of file