Merge branch 'release/3.4' into release/3.5

This commit is contained in:
Dylan K. Taylor 2018-12-14 09:39:21 +00:00
commit c05697f506
4 changed files with 31 additions and 20 deletions

View File

@ -278,7 +278,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/** @var int */ /** @var int */
protected $spawnThreshold; protected $spawnThreshold;
/** @var int */ /** @var int */
protected $chunkLoadCount = 0; protected $spawnChunkLoadCount = 0;
/** @var int */ /** @var int */
protected $chunksPerTick; protected $chunksPerTick;
@ -964,8 +964,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
} }
$this->usedChunks[Level::chunkHash($x, $z)] = true; $this->usedChunks[Level::chunkHash($x, $z)] = true;
$this->chunkLoadCount++;
$this->dataPacket($payload); $this->dataPacket($payload);
if($this->spawned){ if($this->spawned){
@ -976,8 +974,9 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
} }
} }
if($this->chunkLoadCount >= $this->spawnThreshold and !$this->spawned){ if($this->spawnChunkLoadCount !== -1 and ++$this->spawnChunkLoadCount >= $this->spawnThreshold){
$this->doFirstSpawn(); $this->sendPlayStatus(PlayStatusPacket::PLAYER_SPAWN);
$this->spawnChunkLoadCount = -1;
} }
} }
@ -1015,11 +1014,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
Timings::$playerChunkSendTimer->stopTiming(); Timings::$playerChunkSendTimer->stopTiming();
} }
protected function doFirstSpawn(){ public function doFirstSpawn(){
if($this->spawned){
return; //avoid player spawning twice (this can only happen on 3.x with a custom malicious client)
}
$this->spawned = true; $this->spawned = true;
$this->sendPlayStatus(PlayStatusPacket::PLAYER_SPAWN);
if($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)){ if($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)){
PermissionManager::getInstance()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this); PermissionManager::getInstance()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this);
} }

View File

@ -637,6 +637,9 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
* @param float $value * @param float $value
*/ */
public function setScale(float $value) : void{ public function setScale(float $value) : void{
if($value <= 0){
throw new \InvalidArgumentException("Scale must be greater than 0");
}
$multiplier = $value / $this->getScale(); $multiplier = $value / $this->getScale();
$this->width *= $multiplier; $this->width *= $multiplier;

View File

@ -451,13 +451,14 @@ class Level implements ChunkManager, Metadatable{
if(!is_array($pk)){ if(!is_array($pk)){
$pk = [$pk]; $pk = [$pk];
} }
if(!empty($pk)){
if($players === null){ if($players === null){
foreach($pk as $e){ foreach($pk as $e){
$this->broadcastPacketToViewers($sound, $e); $this->broadcastPacketToViewers($sound, $e);
}
}else{
$this->server->batchPackets($players, $pk, false);
} }
}else{
$this->server->batchPackets($players, $pk, false);
} }
} }
@ -466,13 +467,14 @@ class Level implements ChunkManager, Metadatable{
if(!is_array($pk)){ if(!is_array($pk)){
$pk = [$pk]; $pk = [$pk];
} }
if(!empty($pk)){
if($players === null){ if($players === null){
foreach($pk as $e){ foreach($pk as $e){
$this->broadcastPacketToViewers($particle, $e); $this->broadcastPacketToViewers($particle, $e);
}
}else{
$this->server->batchPackets($players, $pk, false);
} }
}else{
$this->server->batchPackets($players, $pk, false);
} }
} }

View File

@ -59,6 +59,7 @@ 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\ServerSettingsRequestPacket; use pocketmine\network\mcpe\protocol\ServerSettingsRequestPacket;
use pocketmine\network\mcpe\protocol\SetLocalPlayerAsInitializedPacket;
use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket; use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket;
use pocketmine\network\mcpe\protocol\ShowCreditsPacket; use pocketmine\network\mcpe\protocol\ShowCreditsPacket;
use pocketmine\network\mcpe\protocol\SpawnExperienceOrbPacket; use pocketmine\network\mcpe\protocol\SpawnExperienceOrbPacket;
@ -282,6 +283,11 @@ class PlayerNetworkSessionAdapter extends NetworkSession{
return false; //TODO: GUI stuff return false; //TODO: GUI stuff
} }
public function handleSetLocalPlayerAsInitialized(SetLocalPlayerAsInitializedPacket $packet) : bool{
$this->player->doFirstSpawn();
return true;
}
public function handleLevelSoundEvent(LevelSoundEventPacket $packet) : bool{ public function handleLevelSoundEvent(LevelSoundEventPacket $packet) : bool{
return $this->player->handleLevelSoundEvent($packet); return $this->player->handleLevelSoundEvent($packet);
} }