mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-07 12:18:46 +00:00
World: allow configuring blocks-per-tick for random updating
this makes it much easier to observe and debug stuff that depends on it, such as grass, crop and tree growth, since they'll happen much faster. A future improvement would be to have the update function use a non-global random so that the output can be reproduced using a given seed.
This commit is contained in:
parent
a6c35cab9a
commit
8efe7fcfb0
@ -120,6 +120,9 @@ chunk-ticking:
|
|||||||
per-tick: 40
|
per-tick: 40
|
||||||
#Radius of chunks around a player to tick
|
#Radius of chunks around a player to tick
|
||||||
tick-radius: 3
|
tick-radius: 3
|
||||||
|
#Number of blocks inside ticking areas' subchunks that get ticked every tick. Higher values will accelerate events
|
||||||
|
#like tree and plant growth, but at a higher performance cost.
|
||||||
|
blocks-per-subchunk-per-tick: 3
|
||||||
#IDs of blocks not to perform random ticking on.
|
#IDs of blocks not to perform random ticking on.
|
||||||
disable-block-ticking:
|
disable-block-ticking:
|
||||||
#- 2 # grass
|
#- 2 # grass
|
||||||
|
@ -125,6 +125,8 @@ class World implements ChunkManager{
|
|||||||
public const DIFFICULTY_NORMAL = 2;
|
public const DIFFICULTY_NORMAL = 2;
|
||||||
public const DIFFICULTY_HARD = 3;
|
public const DIFFICULTY_HARD = 3;
|
||||||
|
|
||||||
|
public const DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK = 3;
|
||||||
|
|
||||||
/** @var Player[] */
|
/** @var Player[] */
|
||||||
private $players = [];
|
private $players = [];
|
||||||
|
|
||||||
@ -226,6 +228,8 @@ class World implements ChunkManager{
|
|||||||
private $chunkTickRadius;
|
private $chunkTickRadius;
|
||||||
/** @var int */
|
/** @var int */
|
||||||
private $chunksPerTick;
|
private $chunksPerTick;
|
||||||
|
/** @var int */
|
||||||
|
private $tickedBlocksPerSubchunkPerTick = self::DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK;
|
||||||
/** @var bool[] */
|
/** @var bool[] */
|
||||||
private $randomTickBlocks = [];
|
private $randomTickBlocks = [];
|
||||||
|
|
||||||
@ -342,6 +346,7 @@ class World implements ChunkManager{
|
|||||||
|
|
||||||
$this->chunkTickRadius = min($this->server->getViewDistance(), max(1, (int) $this->server->getProperty("chunk-ticking.tick-radius", 4)));
|
$this->chunkTickRadius = min($this->server->getViewDistance(), max(1, (int) $this->server->getProperty("chunk-ticking.tick-radius", 4)));
|
||||||
$this->chunksPerTick = (int) $this->server->getProperty("chunk-ticking.per-tick", 40);
|
$this->chunksPerTick = (int) $this->server->getProperty("chunk-ticking.per-tick", 40);
|
||||||
|
$this->tickedBlocksPerSubchunkPerTick = (int) $this->server->getProperty("chunk-ticking.blocks-per-subchunk-per-tick", self::DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK);
|
||||||
$this->chunkPopulationQueueSize = (int) $this->server->getProperty("chunk-generation.population-queue-size", 2);
|
$this->chunkPopulationQueueSize = (int) $this->server->getProperty("chunk-generation.population-queue-size", 2);
|
||||||
|
|
||||||
$dontTickBlocks = array_fill_keys($this->server->getProperty("chunk-ticking.disable-block-ticking", []), true);
|
$dontTickBlocks = array_fill_keys($this->server->getProperty("chunk-ticking.disable-block-ticking", []), true);
|
||||||
@ -910,8 +915,12 @@ class World implements ChunkManager{
|
|||||||
|
|
||||||
foreach($chunk->getSubChunks() as $Y => $subChunk){
|
foreach($chunk->getSubChunks() as $Y => $subChunk){
|
||||||
if(!$subChunk->isEmptyFast()){
|
if(!$subChunk->isEmptyFast()){
|
||||||
$k = mt_rand(0, 0xfffffffff); //36 bits
|
$k = 0;
|
||||||
for($i = 0; $i < 3; ++$i){
|
for($i = 0; $i < $this->tickedBlocksPerSubchunkPerTick; ++$i){
|
||||||
|
if(($i % 5) === 0){
|
||||||
|
//60 bits will be used by 5 blocks (12 bits each)
|
||||||
|
$k = mt_rand(0, (1 << 60) - 1);
|
||||||
|
}
|
||||||
$x = $k & 0x0f;
|
$x = $k & 0x0f;
|
||||||
$y = ($k >> 4) & 0x0f;
|
$y = ($k >> 4) & 0x0f;
|
||||||
$z = ($k >> 8) & 0x0f;
|
$z = ($k >> 8) & 0x0f;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user