mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-13 01:09: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\utils\Utils;
|
||||||
use pocketmine\world\Position;
|
use pocketmine\world\Position;
|
||||||
use function array_map;
|
use function array_map;
|
||||||
|
use function assert;
|
||||||
use function base64_encode;
|
use function base64_encode;
|
||||||
use function bin2hex;
|
use function bin2hex;
|
||||||
use function count;
|
use function count;
|
||||||
@ -744,13 +745,19 @@ class NetworkSession{
|
|||||||
public function startUsingChunk(int $chunkX, int $chunkZ, \Closure $onCompletion) : void{
|
public function startUsingChunk(int $chunkX, int $chunkZ, \Closure $onCompletion) : void{
|
||||||
Utils::validateCallableSignature(function(int $chunkX, int $chunkZ){}, $onCompletion);
|
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
|
//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()){
|
if(!$this->isConnected()){
|
||||||
return;
|
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();
|
$this->player->world->timings->syncChunkSendTimer->startTiming();
|
||||||
try{
|
try{
|
||||||
$this->queueCompressed($promise);
|
$this->queueCompressed($promise);
|
||||||
|
@ -1039,6 +1039,10 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
|
|||||||
Timings::$playerChunkOrderTimer->stopTiming();
|
Timings::$playerChunkOrderTimer->stopTiming();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isUsingChunk(int $chunkX, int $chunkZ) : bool{
|
||||||
|
return isset($this->usedChunks[World::chunkHash($chunkX, $chunkZ)]);
|
||||||
|
}
|
||||||
|
|
||||||
public function doChunkRequests(){
|
public function doChunkRequests(){
|
||||||
if($this->nextChunkOrderRun !== PHP_INT_MAX and $this->nextChunkOrderRun-- <= 0){
|
if($this->nextChunkOrderRun !== PHP_INT_MAX and $this->nextChunkOrderRun-- <= 0){
|
||||||
$this->nextChunkOrderRun = PHP_INT_MAX;
|
$this->nextChunkOrderRun = PHP_INT_MAX;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user