Player: do not re-request the same ungenerated chunks multiple times

this doesn't affect chunk resends, since they'll be kicked back to NEEDED, which is detected by orderChunks().
This commit is contained in:
Dylan K. Taylor
2021-10-31 16:43:32 +00:00
parent c580bb2434
commit 866020dfdb
3 changed files with 10 additions and 12 deletions

View File

@ -676,7 +676,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
++$count;
$this->usedChunks[$index] = UsedChunkStatus::NEEDED();
$this->usedChunks[$index] = UsedChunkStatus::REQUESTED_GENERATION();
unset($this->loadQueue[$index]);
$this->getWorld()->registerChunkLoader($this->chunkLoader, $X, $Z, true);
$this->getWorld()->registerChunkListener($this, $X, $Z);
@ -685,15 +686,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
if(!$this->isConnected() || !isset($this->usedChunks[$index]) || $world !== $this->getWorld()){
return;
}
if(!$this->usedChunks[$index]->equals(UsedChunkStatus::NEEDED())){
//TODO: make this an error
//we may have added multiple completion handlers, since the Player keeps re-requesting chunks
//it doesn't have yet (a relic from the old system, but also currently relied on for chunk resends).
//in this event, make sure we don't try to send the chunk multiple times.
return;
if(!$this->usedChunks[$index]->equals(UsedChunkStatus::REQUESTED_GENERATION())){
throw new AssumptionFailedError("Used chunk status should not have changed while in REQUESTED_GENERATION mode");
}
unset($this->loadQueue[$index]);
$this->usedChunks[$index] = UsedChunkStatus::REQUESTED();
$this->usedChunks[$index] = UsedChunkStatus::REQUESTED_SENDING();
$this->getNetworkSession()->startUsingChunk($X, $Z, function() use ($X, $Z, $index) : void{
$this->usedChunks[$index] = UsedChunkStatus::SENT();