World: allow registering unload hooks

this will be used for cache management when worlds get unloaded.
This commit is contained in:
Dylan K. Taylor 2020-04-29 18:48:16 +01:00
parent bb11cbd89c
commit 3ce9a4801f

View File

@ -246,6 +246,11 @@ class World implements ChunkManager{
/** @var bool */ /** @var bool */
private $closed = false; private $closed = false;
/**
* @var \Closure[]
* @phpstan-var array<int, \Closure() : void>
*/
private $unloadCallbacks = [];
/** @var BlockLightUpdate|null */ /** @var BlockLightUpdate|null */
private $blockLightUpdate = null; private $blockLightUpdate = null;
@ -405,6 +410,11 @@ class World implements ChunkManager{
throw new \InvalidStateException("Tried to close a world which is already closed"); throw new \InvalidStateException("Tried to close a world which is already closed");
} }
foreach($this->unloadCallbacks as $callback){
$callback();
}
$this->unloadCallbacks = [];
foreach($this->chunks as $chunk){ foreach($this->chunks as $chunk){
$this->unloadChunk($chunk->getX(), $chunk->getZ(), false); $this->unloadChunk($chunk->getX(), $chunk->getZ(), false);
} }
@ -421,6 +431,14 @@ class World implements ChunkManager{
$this->closed = true; $this->closed = true;
} }
public function addOnUnloadCallback(\Closure $callback) : void{
$this->unloadCallbacks[spl_object_id($callback)] = $callback;
}
public function removeOnUnloadCallback(\Closure $callback) : void{
unset($this->unloadCallbacks[spl_object_id($callback)]);
}
/** /**
* @param Player[]|null $players * @param Player[]|null $players
*/ */