World: rely on Player being a ChunkListener instead of ChunkLoader

ChunkListeners are less dangerous, and also make more sense considering the usages.
Ideally we want to not have to care if a listener is a Player at all, but that's still some work away yet.
This commit is contained in:
Dylan K. Taylor 2020-07-11 18:20:32 +01:00
parent 923ea46476
commit 180c0e4999

View File

@ -165,11 +165,11 @@ class World implements ChunkManager{
private $loaderCounter = []; private $loaderCounter = [];
/** @var ChunkLoader[][] */ /** @var ChunkLoader[][] */
private $chunkLoaders = []; private $chunkLoaders = [];
/** @var Player[][] */
private $playerLoaders = [];
/** @var ChunkListener[][] */ /** @var ChunkListener[][] */
private $chunkListeners = []; private $chunkListeners = [];
/** @var Player[][] */
private $playerChunkListeners = [];
/** @var ClientboundPacket[][] */ /** @var ClientboundPacket[][] */
private $chunkPackets = []; private $chunkPackets = [];
@ -499,7 +499,7 @@ class World implements ChunkManager{
* @return Player[] * @return Player[]
*/ */
public function getChunkPlayers(int $chunkX, int $chunkZ) : array{ public function getChunkPlayers(int $chunkX, int $chunkZ) : array{
return $this->playerLoaders[World::chunkHash($chunkX, $chunkZ)] ?? []; return $this->playerChunkListeners[World::chunkHash($chunkX, $chunkZ)] ?? [];
} }
/** /**
@ -536,15 +536,11 @@ class World implements ChunkManager{
if(!isset($this->chunkLoaders[$chunkHash = World::chunkHash($chunkX, $chunkZ)])){ if(!isset($this->chunkLoaders[$chunkHash = World::chunkHash($chunkX, $chunkZ)])){
$this->chunkLoaders[$chunkHash] = []; $this->chunkLoaders[$chunkHash] = [];
$this->playerLoaders[$chunkHash] = [];
}elseif(isset($this->chunkLoaders[$chunkHash][$loaderId])){ }elseif(isset($this->chunkLoaders[$chunkHash][$loaderId])){
return; return;
} }
$this->chunkLoaders[$chunkHash][$loaderId] = $loader; $this->chunkLoaders[$chunkHash][$loaderId] = $loader;
if($loader instanceof Player){
$this->playerLoaders[$chunkHash][$loaderId] = $loader;
}
if(!isset($this->loaders[$loaderId])){ if(!isset($this->loaders[$loaderId])){
$this->loaderCounter[$loaderId] = 1; $this->loaderCounter[$loaderId] = 1;
@ -565,10 +561,8 @@ class World implements ChunkManager{
$loaderId = spl_object_id($loader); $loaderId = spl_object_id($loader);
if(isset($this->chunkLoaders[$chunkHash][$loaderId])){ if(isset($this->chunkLoaders[$chunkHash][$loaderId])){
unset($this->chunkLoaders[$chunkHash][$loaderId]); unset($this->chunkLoaders[$chunkHash][$loaderId]);
unset($this->playerLoaders[$chunkHash][$loaderId]);
if(count($this->chunkLoaders[$chunkHash]) === 0){ if(count($this->chunkLoaders[$chunkHash]) === 0){
unset($this->chunkLoaders[$chunkHash]); unset($this->chunkLoaders[$chunkHash]);
unset($this->playerLoaders[$chunkHash]);
$this->unloadChunkRequest($chunkX, $chunkZ, true); $this->unloadChunkRequest($chunkX, $chunkZ, true);
} }
@ -589,6 +583,9 @@ class World implements ChunkManager{
}else{ }else{
$this->chunkListeners[$hash] = [spl_object_id($listener) => $listener]; $this->chunkListeners[$hash] = [spl_object_id($listener) => $listener];
} }
if($listener instanceof Player){
$this->playerChunkListeners[$hash][spl_object_id($listener)] = $listener;
}
} }
/** /**
@ -600,8 +597,10 @@ class World implements ChunkManager{
$hash = World::chunkHash($chunkX, $chunkZ); $hash = World::chunkHash($chunkX, $chunkZ);
if(isset($this->chunkListeners[$hash])){ if(isset($this->chunkListeners[$hash])){
unset($this->chunkListeners[$hash][spl_object_id($listener)]); unset($this->chunkListeners[$hash][spl_object_id($listener)]);
unset($this->playerChunkListeners[$hash][spl_object_id($listener)]);
if(count($this->chunkListeners[$hash]) === 0){ if(count($this->chunkListeners[$hash]) === 0){
unset($this->chunkListeners[$hash]); unset($this->chunkListeners[$hash]);
unset($this->playerChunkListeners[$hash]);
} }
} }
} }