Separate TickingChunkLoader from ChunkLoader

this makes it possible to keep chunks loaded without ticking them.
This commit is contained in:
Dylan K. Taylor
2021-03-18 23:19:27 +00:00
parent d1387ebd0a
commit c092a2e836
6 changed files with 54 additions and 14 deletions

View File

@ -24,7 +24,7 @@ declare(strict_types=1);
namespace pocketmine\world;
/**
* If you want to keep chunks loaded, implement this interface and register it into World. This will also tick chunks.
* If you want to keep chunks loaded, implement this interface and register it into World.
*
* @see World::registerChunkLoader()
* @see World::unregisterChunkLoader()
@ -34,13 +34,4 @@ namespace pocketmine\world;
*/
interface ChunkLoader{
/**
* @return float
*/
public function getX();
/**
* @return float
*/
public function getZ();
}

View File

@ -0,0 +1,42 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\world;
/**
* TickingChunkLoader includes all of the same functionality as ChunkLoader (it can be used in the same way).
* However, using this version will also cause chunks around the loader's reported coordinates to get random block
* updates.
*/
interface TickingChunkLoader extends ChunkLoader{
/**
* @return float
*/
public function getX();
/**
* @return float
*/
public function getZ();
}

View File

@ -951,6 +951,10 @@ class World implements ChunkManager{
$randRange = (int) ($randRange > $this->chunkTickRadius ? $this->chunkTickRadius : $randRange);
foreach($this->loaders as $loader){
if(!($loader instanceof TickingChunkLoader)){
//TODO: maybe we should just not track non-ticking chunk loaders here?
continue;
}
$chunkX = (int) floor($loader->getX()) >> 4;
$chunkZ = (int) floor($loader->getZ()) >> 4;