Fixed wrong chunks being sent to players post-teleport or post-world-change

This commit is contained in:
Dylan K. Taylor 2019-06-25 13:41:03 +01:00
parent d15284e638
commit de10e401bf
2 changed files with 13 additions and 2 deletions

View File

@ -77,6 +77,7 @@ use pocketmine\utils\TextFormat;
use pocketmine\utils\Utils;
use pocketmine\world\Position;
use function array_map;
use function assert;
use function base64_encode;
use function bin2hex;
use function count;
@ -744,13 +745,19 @@ class NetworkSession{
public function startUsingChunk(int $chunkX, int $chunkZ, \Closure $onCompletion) : void{
Utils::validateCallableSignature(function(int $chunkX, int $chunkZ){}, $onCompletion);
ChunkCache::getInstance($this->player->getWorld())->request($chunkX, $chunkZ)->onResolve(
$world = $this->player->getWorld();
assert($world !== null);
ChunkCache::getInstance($world)->request($chunkX, $chunkZ)->onResolve(
//this callback may be called synchronously or asynchronously, depending on whether the promise is resolved yet
function(CompressBatchPromise $promise) use ($chunkX, $chunkZ, $onCompletion){
function(CompressBatchPromise $promise) use ($world, $chunkX, $chunkZ, $onCompletion){
if(!$this->isConnected()){
return;
}
if($world !== $this->player->getWorld() or !$this->player->isUsingChunk($chunkX, $chunkZ)){
$this->logger->debug("Tried to send no-longer-active chunk $chunkX $chunkZ in world " . $world->getFolderName());
return;
}
$this->player->world->timings->syncChunkSendTimer->startTiming();
try{
$this->queueCompressed($promise);

View File

@ -1039,6 +1039,10 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
Timings::$playerChunkOrderTimer->stopTiming();
}
public function isUsingChunk(int $chunkX, int $chunkZ) : bool{
return isset($this->usedChunks[World::chunkHash($chunkX, $chunkZ)]);
}
public function doChunkRequests(){
if($this->nextChunkOrderRun !== PHP_INT_MAX and $this->nextChunkOrderRun-- <= 0){
$this->nextChunkOrderRun = PHP_INT_MAX;