mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-12 16:59:44 +00:00
Fixed wrong chunks being sent to players post-teleport or post-world-change
This commit is contained in:
parent
d15284e638
commit
de10e401bf
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user