mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-05 17:36:12 +00:00
New generic in-memory chunk format, fixed 0.17.0.1 chunk loading
Terrible performance, needs profiling. TODO: fix this.
This commit is contained in:
@ -31,7 +31,7 @@ use pocketmine\block\LapisOre;
|
||||
use pocketmine\block\RedstoneOre;
|
||||
use pocketmine\item\Item;
|
||||
use pocketmine\level\ChunkManager;
|
||||
use pocketmine\level\format\FullChunk;
|
||||
use pocketmine\level\format\Chunk;
|
||||
use pocketmine\level\generator\biome\Biome;
|
||||
use pocketmine\level\generator\populator\Ore;
|
||||
use pocketmine\level\generator\populator\Populator;
|
||||
@ -41,7 +41,7 @@ use pocketmine\utils\Random;
|
||||
class Flat extends Generator{
|
||||
/** @var ChunkManager */
|
||||
private $level;
|
||||
/** @var FullChunk */
|
||||
/** @var Chunk */
|
||||
private $chunk;
|
||||
/** @var Random */
|
||||
private $random;
|
||||
|
@ -21,7 +21,8 @@
|
||||
|
||||
namespace pocketmine\level\generator;
|
||||
|
||||
use pocketmine\level\format\FullChunk;
|
||||
use pocketmine\level\format\Chunk;
|
||||
use pocketmine\level\format\generic\GenericChunk;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\level\SimpleChunkManager;
|
||||
use pocketmine\scheduler\AsyncTask;
|
||||
@ -34,10 +35,10 @@ class GenerationTask extends AsyncTask{
|
||||
public $chunk;
|
||||
public $chunkClass;
|
||||
|
||||
public function __construct(Level $level, FullChunk $chunk){
|
||||
public function __construct(Level $level, Chunk $chunk){
|
||||
$this->state = true;
|
||||
$this->levelId = $level->getId();
|
||||
$this->chunk = $chunk->toFastBinary();
|
||||
$this->chunk = GenericChunk::fastSerialize($chunk);
|
||||
$this->chunkClass = get_class($chunk);
|
||||
}
|
||||
|
||||
@ -51,9 +52,9 @@ class GenerationTask extends AsyncTask{
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var FullChunk $chunk */
|
||||
/** @var Chunk $chunk */
|
||||
$chunk = $this->chunkClass;
|
||||
$chunk = $chunk::fromFastBinary($this->chunk);
|
||||
$chunk = GenericChunk::fastDeserialize($this->chunk);
|
||||
if($chunk === null){
|
||||
//TODO error
|
||||
return;
|
||||
@ -65,7 +66,7 @@ class GenerationTask extends AsyncTask{
|
||||
|
||||
$chunk = $manager->getChunk($chunk->getX(), $chunk->getZ());
|
||||
$chunk->setGenerated();
|
||||
$this->chunk = $chunk->toFastBinary();
|
||||
$this->chunk = GenericChunk::fastSerialize($chunk);
|
||||
|
||||
$manager->setChunk($chunk->getX(), $chunk->getZ(), null);
|
||||
}
|
||||
@ -77,9 +78,9 @@ class GenerationTask extends AsyncTask{
|
||||
$level->registerGenerator();
|
||||
return;
|
||||
}
|
||||
/** @var FullChunk $chunk */
|
||||
/** @var Chunk $chunk */
|
||||
$chunk = $this->chunkClass;
|
||||
$chunk = $chunk::fromFastBinary($this->chunk, $level->getProvider());
|
||||
$chunk = GenericChunk::fastDeserialize($this->chunk, $level->getProvider());
|
||||
if($chunk === null){
|
||||
//TODO error
|
||||
return;
|
||||
|
@ -21,7 +21,8 @@
|
||||
|
||||
namespace pocketmine\level\generator;
|
||||
|
||||
use pocketmine\level\format\FullChunk;
|
||||
use pocketmine\level\format\Chunk;
|
||||
use pocketmine\level\format\generic\FullChunk;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\scheduler\AsyncTask;
|
||||
use pocketmine\Server;
|
||||
@ -32,16 +33,16 @@ class LightPopulationTask extends AsyncTask{
|
||||
public $chunk;
|
||||
public $chunkClass;
|
||||
|
||||
public function __construct(Level $level, FullChunk $chunk){
|
||||
public function __construct(Level $level, Chunk $chunk){
|
||||
$this->levelId = $level->getId();
|
||||
$this->chunk = $chunk->toFastBinary();
|
||||
$this->chunk = GenericChunk::fastDeserialize($this->chunk);
|
||||
$this->chunkClass = get_class($chunk);
|
||||
}
|
||||
|
||||
public function onRun(){
|
||||
/** @var FullChunk $chunk */
|
||||
/** @var Chunk $chunk */
|
||||
$chunk = $this->chunkClass;
|
||||
$chunk = $chunk::fromFastBinary($this->chunk);
|
||||
$chunk = GenericChunk::fastDeserialize($this->chunk);
|
||||
if($chunk === null){
|
||||
//TODO error
|
||||
return;
|
||||
@ -51,15 +52,15 @@ class LightPopulationTask extends AsyncTask{
|
||||
$chunk->populateSkyLight();
|
||||
$chunk->setLightPopulated();
|
||||
|
||||
$this->chunk = $chunk->toFastBinary();
|
||||
$this->chunk = GenericChunk::fastSerialize($chunk);
|
||||
}
|
||||
|
||||
public function onCompletion(Server $server){
|
||||
$level = $server->getLevel($this->levelId);
|
||||
if($level !== null){
|
||||
/** @var FullChunk $chunk */
|
||||
/** @var Chunk $chunk */
|
||||
$chunk = $this->chunkClass;
|
||||
$chunk = $chunk::fromFastBinary($this->chunk, $level->getProvider());
|
||||
$chunk = GenericChunk::fastDeserialize($this->chunk, $level->getProvider());
|
||||
if($chunk === null){
|
||||
//TODO error
|
||||
return;
|
||||
|
@ -21,7 +21,8 @@
|
||||
|
||||
namespace pocketmine\level\generator;
|
||||
|
||||
use pocketmine\level\format\FullChunk;
|
||||
use pocketmine\level\format\Chunk;
|
||||
use pocketmine\level\format\generic\GenericChunk;
|
||||
use pocketmine\level\Level;
|
||||
use pocketmine\level\SimpleChunkManager;
|
||||
use pocketmine\scheduler\AsyncTask;
|
||||
@ -29,11 +30,9 @@ use pocketmine\Server;
|
||||
|
||||
class PopulationTask extends AsyncTask{
|
||||
|
||||
|
||||
public $state;
|
||||
public $levelId;
|
||||
public $chunk;
|
||||
public $chunkClass;
|
||||
|
||||
public $chunk0;
|
||||
public $chunk1;
|
||||
@ -45,11 +44,10 @@ class PopulationTask extends AsyncTask{
|
||||
public $chunk7;
|
||||
public $chunk8;
|
||||
|
||||
public function __construct(Level $level, FullChunk $chunk){
|
||||
public function __construct(Level $level, Chunk $chunk){
|
||||
$this->state = true;
|
||||
$this->levelId = $level->getId();
|
||||
$this->chunk = $chunk->toFastBinary();
|
||||
$this->chunkClass = get_class($chunk);
|
||||
$this->chunk = GenericChunk::fastSerialize($chunk);
|
||||
|
||||
for($i = 0; $i < 9; ++$i){
|
||||
if($i === 4){
|
||||
@ -58,7 +56,7 @@ class PopulationTask extends AsyncTask{
|
||||
$xx = -1 + $i % 3;
|
||||
$zz = -1 + (int) ($i / 3);
|
||||
$ck = $level->getChunk($chunk->getX() + $xx, $chunk->getZ() + $zz, false);
|
||||
$this->{"chunk$i"} = $ck !== null ? $ck->toFastBinary() : null;
|
||||
$this->{"chunk$i"} = $ck !== null ? GenericChunk::fastSerialize($ck) : null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,12 +70,10 @@ class PopulationTask extends AsyncTask{
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var FullChunk[] $chunks */
|
||||
/** @var Chunk[] $chunks */
|
||||
$chunks = [];
|
||||
/** @var FullChunk $chunkC */
|
||||
$chunkC = $this->chunkClass;
|
||||
|
||||
$chunk = $chunkC::fromFastBinary($this->chunk);
|
||||
$chunk = GenericChunk::fastDeserialize($this->chunk);
|
||||
|
||||
for($i = 0; $i < 9; ++$i){
|
||||
if($i === 4){
|
||||
@ -87,9 +83,9 @@ class PopulationTask extends AsyncTask{
|
||||
$zz = -1 + (int) ($i / 3);
|
||||
$ck = $this->{"chunk$i"};
|
||||
if($ck === null){
|
||||
$chunks[$i] = $chunkC::getEmptyChunk($chunk->getX() + $xx, $chunk->getZ() + $zz);
|
||||
$chunks[$i] = GenericChunk::getEmptyChunk($chunk->getX() + $xx, $chunk->getZ() + $zz);
|
||||
}else{
|
||||
$chunks[$i] = $chunkC::fromFastBinary($ck);
|
||||
$chunks[$i] = GenericChunk::fastDeserialize($ck);
|
||||
}
|
||||
}
|
||||
|
||||
@ -122,7 +118,7 @@ class PopulationTask extends AsyncTask{
|
||||
$chunk->populateSkyLight();
|
||||
$chunk->setLightPopulated();
|
||||
$chunk->setPopulated();
|
||||
$this->chunk = $chunk->toFastBinary();
|
||||
$this->chunk = GenericChunk::fastSerialize($chunk);
|
||||
|
||||
$manager->setChunk($chunk->getX(), $chunk->getZ(), null);
|
||||
|
||||
@ -145,7 +141,7 @@ class PopulationTask extends AsyncTask{
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->{"chunk$i"} = $chunks[$i] !== null ? $chunks[$i]->toFastBinary() : null;
|
||||
$this->{"chunk$i"} = $chunks[$i] !== null ? GenericChunk::fastSerialize($chunks[$i]) : null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -157,10 +153,7 @@ class PopulationTask extends AsyncTask{
|
||||
return;
|
||||
}
|
||||
|
||||
/** @var FullChunk $chunkC */
|
||||
$chunkC = $this->chunkClass;
|
||||
|
||||
$chunk = $chunkC::fromFastBinary($this->chunk, $level->getProvider());
|
||||
$chunk = GenericChunk::fastDeserialize($this->chunk, $level->getProvider());
|
||||
|
||||
if($chunk === null){
|
||||
//TODO error
|
||||
@ -173,7 +166,7 @@ class PopulationTask extends AsyncTask{
|
||||
}
|
||||
$c = $this->{"chunk$i"};
|
||||
if($c !== null){
|
||||
$c = $chunkC::fromFastBinary($c, $level->getProvider());
|
||||
$c = GenericChunk::fastDeserialize($c, $level->getProvider());
|
||||
$level->generateChunkCallback($c->getX(), $c->getZ(), $c);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user