Merge branch 'release/3.2'

This commit is contained in:
Dylan K. Taylor 2018-08-03 18:24:50 +01:00
commit 588d6c4b26

View File

@ -190,7 +190,7 @@ class Level implements ChunkManager, Metadatable{
/** @var Player[][] */ /** @var Player[][] */
private $chunkSendQueue = []; private $chunkSendQueue = [];
/** @var bool[] */ /** @var ChunkRequestTask[] */
private $chunkSendTasks = []; private $chunkSendTasks = [];
/** @var bool[] */ /** @var bool[] */
@ -2460,7 +2460,7 @@ class Level implements ChunkManager, Metadatable{
} }
private function sendChunkFromCache(int $x, int $z){ private function sendChunkFromCache(int $x, int $z){
if(isset($this->chunkSendTasks[$index = Level::chunkHash($x, $z)])){ if(isset($this->chunkSendQueue[$index = Level::chunkHash($x, $z)])){
foreach($this->chunkSendQueue[$index] as $player){ foreach($this->chunkSendQueue[$index] as $player){
/** @var Player $player */ /** @var Player $player */
if($player->isConnected() and isset($player->usedChunks[$index])){ if($player->isConnected() and isset($player->usedChunks[$index])){
@ -2468,7 +2468,6 @@ class Level implements ChunkManager, Metadatable{
} }
} }
unset($this->chunkSendQueue[$index]); unset($this->chunkSendQueue[$index]);
unset($this->chunkSendTasks[$index]);
} }
} }
@ -2477,11 +2476,17 @@ class Level implements ChunkManager, Metadatable{
$this->timings->syncChunkSendTimer->startTiming(); $this->timings->syncChunkSendTimer->startTiming();
foreach($this->chunkSendQueue as $index => $players){ foreach($this->chunkSendQueue as $index => $players){
Level::getXZ($index, $x, $z);
if(isset($this->chunkSendTasks[$index])){ if(isset($this->chunkSendTasks[$index])){
if($this->chunkSendTasks[$index]->isCrashed()){
unset($this->chunkSendTasks[$index]);
$this->server->getLogger()->error("Failed to prepare chunk $x $z for sending, retrying");
}else{
//Not ready for sending yet
continue; continue;
} }
Level::getXZ($index, $x, $z); }
$this->chunkSendTasks[$index] = true;
if(isset($this->chunkCache[$index])){ if(isset($this->chunkCache[$index])){
$this->sendChunkFromCache($x, $z); $this->sendChunkFromCache($x, $z);
continue; continue;
@ -2494,7 +2499,8 @@ class Level implements ChunkManager, Metadatable{
} }
assert($chunk->getX() === $x and $chunk->getZ() === $z, "Chunk coordinate mismatch: expected $x $z, but chunk has coordinates " . $chunk->getX() . " " . $chunk->getZ() . ", did you forget to clone a chunk before setting?"); assert($chunk->getX() === $x and $chunk->getZ() === $z, "Chunk coordinate mismatch: expected $x $z, but chunk has coordinates " . $chunk->getX() . " " . $chunk->getZ() . ", did you forget to clone a chunk before setting?");
$this->server->getAsyncPool()->submitTask(new ChunkRequestTask($this, $x, $z, $chunk)); $this->server->getAsyncPool()->submitTask($task = new ChunkRequestTask($this, $x, $z, $chunk));
$this->chunkSendTasks[$index] = $task;
$this->timings->syncChunkSendPrepareTimer->stopTiming(); $this->timings->syncChunkSendPrepareTimer->stopTiming();
} }
@ -2507,24 +2513,14 @@ class Level implements ChunkManager, Metadatable{
$this->timings->syncChunkSendTimer->startTiming(); $this->timings->syncChunkSendTimer->startTiming();
$index = Level::chunkHash($x, $z); $index = Level::chunkHash($x, $z);
unset($this->chunkSendTasks[$index]);
if(!isset($this->chunkCache[$index]) and $this->server->getMemoryManager()->canUseChunkCache()){
$this->chunkCache[$index] = $payload; $this->chunkCache[$index] = $payload;
$this->sendChunkFromCache($x, $z); $this->sendChunkFromCache($x, $z);
$this->timings->syncChunkSendTimer->stopTiming(); if(!$this->server->getMemoryManager()->canUseChunkCache()){
return; unset($this->chunkCache[$index]);
} }
if(isset($this->chunkSendTasks[$index])){
foreach($this->chunkSendQueue[$index] as $player){
/** @var Player $player */
if($player->isConnected() and isset($player->usedChunks[$index])){
$player->sendChunk($x, $z, $payload);
}
}
unset($this->chunkSendQueue[$index]);
unset($this->chunkSendTasks[$index]);
}
$this->timings->syncChunkSendTimer->stopTiming(); $this->timings->syncChunkSendTimer->stopTiming();
} }
@ -2758,6 +2754,8 @@ class Level implements ChunkManager, Metadatable{
unset($this->chunkCache[$chunkHash]); unset($this->chunkCache[$chunkHash]);
unset($this->blockCache[$chunkHash]); unset($this->blockCache[$chunkHash]);
unset($this->changedBlocks[$chunkHash]); unset($this->changedBlocks[$chunkHash]);
unset($this->chunkSendQueue[$chunkHash]);
unset($this->chunkSendTasks[$chunkHash]);
$this->timings->doChunkUnload->stopTiming(); $this->timings->doChunkUnload->stopTiming();