Fixed respawning

This commit is contained in:
Stephen 2019-11-05 22:33:12 -05:00
parent 17a17c31f3
commit 07f19dd4a1
3 changed files with 21 additions and 4 deletions

View File

@ -1114,7 +1114,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
} }
} }
protected function sendRespawnPacket(Vector3 $pos, int $respawnState = 1){ protected function sendRespawnPacket(Vector3 $pos, int $respawnState = RespawnPacket::SEARCHING_FOR_SPAWN){
$pk = new RespawnPacket(); $pk = new RespawnPacket();
$pk->position = $pos->add(0, $this->baseOffset, 0); $pk->position = $pos->add(0, $this->baseOffset, 0);
$pk->respawnState = $respawnState; $pk->respawnState = $respawnState;
@ -2918,6 +2918,14 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return true; return true;
} }
public function handleRespawn(RespawnPacket $packet) : bool{
if(!$this->isAlive() && $packet->respawnState === RespawnPacket::CLIENT_READY_TO_SPAWN){
$this->sendRespawnPacket($this, RespawnPacket::READY_TO_SPAWN);
}
return true;
}
/** /**
* Drops an item on the ground in front of the player. Returns if the item drop was successful. * Drops an item on the ground in front of the player. Returns if the item drop was successful.
* *

View File

@ -59,6 +59,7 @@ use pocketmine\network\mcpe\protocol\PlayerSkinPacket;
use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket; use pocketmine\network\mcpe\protocol\RequestChunkRadiusPacket;
use pocketmine\network\mcpe\protocol\ResourcePackChunkRequestPacket; use pocketmine\network\mcpe\protocol\ResourcePackChunkRequestPacket;
use pocketmine\network\mcpe\protocol\ResourcePackClientResponsePacket; use pocketmine\network\mcpe\protocol\ResourcePackClientResponsePacket;
use pocketmine\network\mcpe\protocol\RespawnPacket;
use pocketmine\network\mcpe\protocol\ServerSettingsRequestPacket; use pocketmine\network\mcpe\protocol\ServerSettingsRequestPacket;
use pocketmine\network\mcpe\protocol\SetLocalPlayerAsInitializedPacket; use pocketmine\network\mcpe\protocol\SetLocalPlayerAsInitializedPacket;
use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket; use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket;
@ -181,6 +182,10 @@ class PlayerNetworkSessionAdapter extends NetworkSession{
return $this->player->handleAnimate($packet); return $this->player->handleAnimate($packet);
} }
public function handleRespawn(RespawnPacket $packet) : bool{
return $this->player->handleRespawn($packet);
}
public function handleContainerClose(ContainerClosePacket $packet) : bool{ public function handleContainerClose(ContainerClosePacket $packet) : bool{
return $this->player->handleContainerClose($packet); return $this->player->handleContainerClose($packet);
} }

View File

@ -32,22 +32,26 @@ use pocketmine\network\mcpe\NetworkSession;
class RespawnPacket extends DataPacket{ class RespawnPacket extends DataPacket{
public const NETWORK_ID = ProtocolInfo::RESPAWN_PACKET; public const NETWORK_ID = ProtocolInfo::RESPAWN_PACKET;
public const SEARCHING_FOR_SPAWN = 0;
public const READY_TO_SPAWN = 1;
public const CLIENT_READY_TO_SPAWN = 2;
/** @var Vector3 */ /** @var Vector3 */
public $position; public $position;
/** @var int */ /** @var int */
public $respawnState = 1; //TODO: Add public $respawnState = self::SEARCHING_FOR_SPAWN;
/** @var int */ /** @var int */
public $entityRuntimeId; public $entityRuntimeId;
protected function decodePayload(){ protected function decodePayload(){
$this->position = $this->getVector3(); $this->position = $this->getVector3();
$this->respawnState = $this->getInt(); $this->respawnState = $this->getByte();
$this->entityRuntimeId = $this->getEntityRuntimeId(); $this->entityRuntimeId = $this->getEntityRuntimeId();
} }
protected function encodePayload(){ protected function encodePayload(){
$this->putVector3($this->position); $this->putVector3($this->position);
$this->putInt($this->respawnState); $this->putByte($this->respawnState);
$this->putEntityRuntimeId($this->entityRuntimeId); $this->putEntityRuntimeId($this->entityRuntimeId);
} }