mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-03 16:49:53 +00:00
Merge branch 'release/3.2'
This commit is contained in:
commit
588d6c4b26
@ -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();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user