diff --git a/src/event/world/ChunkEvent.php b/src/event/world/ChunkEvent.php index 2c5cb5e51..ebdc2be91 100644 --- a/src/event/world/ChunkEvent.php +++ b/src/event/world/ChunkEvent.php @@ -32,13 +32,23 @@ use pocketmine\world\World; abstract class ChunkEvent extends WorldEvent{ /** @var Chunk */ private $chunk; + /** @var int */ + private $chunkX; + /** @var int */ + private $chunkZ; - public function __construct(World $world, Chunk $chunk){ + public function __construct(World $world, int $chunkX, int $chunkZ, Chunk $chunk){ parent::__construct($world); $this->chunk = $chunk; + $this->chunkX = $chunkX; + $this->chunkZ = $chunkZ; } public function getChunk() : Chunk{ return $this->chunk; } + + public function getChunkX() : int{ return $this->chunkX; } + + public function getChunkZ() : int{ return $this->chunkZ; } } diff --git a/src/event/world/ChunkLoadEvent.php b/src/event/world/ChunkLoadEvent.php index a03c4ad15..f8f1ef776 100644 --- a/src/event/world/ChunkLoadEvent.php +++ b/src/event/world/ChunkLoadEvent.php @@ -33,8 +33,8 @@ class ChunkLoadEvent extends ChunkEvent{ /** @var bool */ private $newChunk; - public function __construct(World $world, Chunk $chunk, bool $newChunk){ - parent::__construct($world, $chunk); + public function __construct(World $world, int $chunkX, int $chunkZ, Chunk $chunk, bool $newChunk){ + parent::__construct($world, $chunkX, $chunkZ, $chunk); $this->newChunk = $newChunk; } diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 395a536b2..d90e0cd32 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -66,7 +66,7 @@ class ChunkRequestTask extends AsyncTask{ } public function onRun() : void{ - $chunk = FastChunkSerializer::deserialize($this->chunk, $this->chunkX, $this->chunkZ); + $chunk = FastChunkSerializer::deserialize($this->chunk); $subCount = ChunkSerializer::getSubChunkCount($chunk); $payload = ChunkSerializer::serialize($chunk, RuntimeBlockMapping::getInstance(), $this->tiles); $this->setResult($this->compressor->compress(PacketBatch::fromPackets(LevelChunkPacket::withoutCache($this->chunkX, $this->chunkZ, $subCount, $payload))->getBuffer())); diff --git a/src/network/mcpe/cache/ChunkCache.php b/src/network/mcpe/cache/ChunkCache.php index afd1a4122..8dd8b8515 100644 --- a/src/network/mcpe/cache/ChunkCache.php +++ b/src/network/mcpe/cache/ChunkCache.php @@ -183,9 +183,9 @@ class ChunkCache implements ChunkListener{ /** * @see ChunkListener::onChunkChanged() */ - public function onChunkChanged(Chunk $chunk) : void{ + public function onChunkChanged(int $chunkX, int $chunkZ, Chunk $chunk) : void{ //FIXME: this gets fired for stuff that doesn't change terrain related things (like lighting updates) - $this->destroyOrRestart($chunk->getX(), $chunk->getZ()); + $this->destroyOrRestart($chunkX, $chunkZ); } /** @@ -200,9 +200,9 @@ class ChunkCache implements ChunkListener{ /** * @see ChunkListener::onChunkUnloaded() */ - public function onChunkUnloaded(Chunk $chunk) : void{ - $this->destroy($chunk->getX(), $chunk->getZ()); - $this->world->unregisterChunkListener($this, $chunk->getX(), $chunk->getZ()); + public function onChunkUnloaded(int $chunkX, int $chunkZ, Chunk $chunk) : void{ + $this->destroy($chunkX, $chunkZ); + $this->world->unregisterChunkListener($this, $chunkX, $chunkZ); } /** diff --git a/src/player/Player.php b/src/player/Player.php index 7051290b6..c80c0b2b4 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2358,18 +2358,18 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ onChunkUnloaded as private; } - public function onChunkChanged(Chunk $chunk) : void{ - $status = $this->usedChunks[$hash = World::chunkHash($chunk->getX(), $chunk->getZ())] ?? null; + public function onChunkChanged(int $chunkX, int $chunkZ, Chunk $chunk) : void{ + $status = $this->usedChunks[$hash = World::chunkHash($chunkX, $chunkZ)] ?? null; if($status !== null && !$status->equals(UsedChunkStatus::NEEDED())){ $this->usedChunks[$hash] = UsedChunkStatus::NEEDED(); $this->nextChunkOrderRun = 0; } } - public function onChunkUnloaded(Chunk $chunk) : void{ - if($this->isUsingChunk($chunk->getX(), $chunk->getZ())){ - $this->logger->debug("Detected forced unload of chunk " . $chunk->getX() . " " . $chunk->getZ()); - $this->unloadChunk($chunk->getX(), $chunk->getZ()); + public function onChunkUnloaded(int $chunkX, int $chunkZ, Chunk $chunk) : void{ + if($this->isUsingChunk($chunkX, $chunkZ)){ + $this->logger->debug("Detected forced unload of chunk " . $chunkX . " " . $chunkZ); + $this->unloadChunk($chunkX, $chunkZ); } } } diff --git a/src/world/ChunkListener.php b/src/world/ChunkListener.php index 937cd0c8b..8fafd73b0 100644 --- a/src/world/ChunkListener.php +++ b/src/world/ChunkListener.php @@ -43,23 +43,23 @@ interface ChunkListener{ /** * This method will be called when a Chunk is replaced by a new one */ - public function onChunkChanged(Chunk $chunk) : void; + public function onChunkChanged(int $chunkX, int $chunkZ, Chunk $chunk) : void; /** * This method will be called when a registered chunk is loaded */ - public function onChunkLoaded(Chunk $chunk) : void; + public function onChunkLoaded(int $chunkX, int $chunkZ, Chunk $chunk) : void; /** * This method will be called when a registered chunk is unloaded */ - public function onChunkUnloaded(Chunk $chunk) : void; + public function onChunkUnloaded(int $chunkX, int $chunkZ, Chunk $chunk) : void; /** * This method will be called when a registered chunk is populated * Usually it'll be sent with another call to onChunkChanged() */ - public function onChunkPopulated(Chunk $chunk) : void; + public function onChunkPopulated(int $chunkX, int $chunkZ, Chunk $chunk) : void; /** * This method will be called when a block changes in a registered chunk diff --git a/src/world/ChunkListenerNoOpTrait.php b/src/world/ChunkListenerNoOpTrait.php index 1d7134bcb..b48a9659c 100644 --- a/src/world/ChunkListenerNoOpTrait.php +++ b/src/world/ChunkListenerNoOpTrait.php @@ -32,19 +32,19 @@ use pocketmine\world\format\Chunk; */ trait ChunkListenerNoOpTrait/* implements ChunkListener*/{ - public function onChunkChanged(Chunk $chunk) : void{ + public function onChunkChanged(int $chunkX, int $chunkZ, Chunk $chunk) : void{ //NOOP } - public function onChunkLoaded(Chunk $chunk) : void{ + public function onChunkLoaded(int $chunkX, int $chunkZ, Chunk $chunk) : void{ //NOOP } - public function onChunkUnloaded(Chunk $chunk) : void{ + public function onChunkUnloaded(int $chunkX, int $chunkZ, Chunk $chunk) : void{ //NOOP } - public function onChunkPopulated(Chunk $chunk) : void{ + public function onChunkPopulated(int $chunkX, int $chunkZ, Chunk $chunk) : void{ //NOOP } diff --git a/src/world/World.php b/src/world/World.php index 6f9d4e23e..c3b677b20 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -461,8 +461,9 @@ class World implements ChunkManager{ } $this->unloadCallbacks = []; - foreach($this->chunks as $chunk){ - $this->unloadChunk($chunk->getX(), $chunk->getZ(), false); + foreach($this->chunks as $chunkHash => $chunk){ + self::getXZ($chunkHash, $chunkX, $chunkZ); + $this->unloadChunk($chunkX, $chunkZ, false); } $this->save(); @@ -796,7 +797,7 @@ class World implements ChunkManager{ if(count($blocks) > 512){ $chunk = $this->getChunk($chunkX, $chunkZ); foreach($this->getChunkPlayers($chunkX, $chunkZ) as $p){ - $p->onChunkChanged($chunk); + $p->onChunkChanged($chunkX, $chunkZ, $chunk); } }else{ foreach($this->createBlockUpdatePackets($blocks) as $packet){ @@ -946,7 +947,7 @@ class World implements ChunkManager{ if($lightPopulatedState !== true){ if($lightPopulatedState === false){ $this->chunks[$hash]->setLightPopulated(null); - $this->workerPool->submitTask(new LightPopulationTask($this, $this->chunks[$hash])); + $this->workerPool->submitTask(new LightPopulationTask($this, $dx + $chunkX, $dz + $chunkZ, $this->chunks[$hash])); } continue; } @@ -1023,9 +1024,10 @@ class World implements ChunkManager{ public function saveChunks() : void{ $this->timings->syncChunkSaveTimer->startTiming(); try{ - foreach($this->chunks as $chunk){ + foreach($this->chunks as $chunkHash => $chunk){ if($chunk->isDirty() and $chunk->isGenerated()){ - $this->provider->saveChunk($chunk); + self::getXZ($chunkHash, $chunkX, $chunkZ); + $this->provider->saveChunk($chunkX, $chunkZ, $chunk); $chunk->clearDirtyFlags(); } } @@ -1979,10 +1981,10 @@ class World implements ChunkManager{ $oldChunk = $this->loadChunk($x, $z); $this->setChunk($x, $z, $chunk, false); if(($oldChunk === null or !$oldChunk->isPopulated()) and $chunk->isPopulated()){ - (new ChunkPopulateEvent($this, $chunk))->call(); + (new ChunkPopulateEvent($this, $x, $z, $chunk))->call(); foreach($this->getChunkListeners($x, $z) as $listener){ - $listener->onChunkPopulated($chunk); + $listener->onChunkPopulated($x, $z, $chunk); } } } @@ -2005,9 +2007,6 @@ class World implements ChunkManager{ return; } - $chunk->setX($chunkX); - $chunk->setZ($chunkZ); - $chunkHash = World::chunkHash($chunkX, $chunkZ); $oldChunk = $this->loadChunk($chunkX, $chunkZ); if($oldChunk !== null and $oldChunk !== $chunk){ @@ -2049,14 +2048,14 @@ class World implements ChunkManager{ } if($oldChunk === null){ - (new ChunkLoadEvent($this, $chunk, true))->call(); + (new ChunkLoadEvent($this, $chunkX, $chunkZ, $chunk, true))->call(); foreach($this->getChunkListeners($chunkX, $chunkZ) as $listener){ - $listener->onChunkLoaded($chunk); + $listener->onChunkLoaded($chunkX, $chunkZ, $chunk); } }else{ foreach($this->getChunkListeners($chunkX, $chunkZ) as $listener){ - $listener->onChunkChanged($chunk); + $listener->onChunkChanged($chunkX, $chunkZ, $chunk); } } } @@ -2233,16 +2232,16 @@ class World implements ChunkManager{ $this->chunks[$chunkHash] = $chunk; unset($this->blockCache[$chunkHash]); - $this->initChunk($chunk); + $this->initChunk($x, $z, $chunk); - (new ChunkLoadEvent($this, $chunk, false))->call(); + (new ChunkLoadEvent($this, $x, $z, $chunk, false))->call(); if(!$this->isChunkInUse($x, $z)){ $this->logger->debug("Newly loaded chunk $x $z has no loaders registered, will be unloaded at next available opportunity"); $this->unloadChunkRequest($x, $z); } foreach($this->getChunkListeners($x, $z) as $listener){ - $listener->onChunkLoaded($chunk); + $listener->onChunkLoaded($x, $z, $chunk); } $this->timings->syncChunkLoadTimer->stopTiming(); @@ -2250,7 +2249,7 @@ class World implements ChunkManager{ return $chunk; } - private function initChunk(Chunk $chunk) : void{ + private function initChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void{ if($chunk->NBTentities !== null){ $this->timings->syncChunkLoadEntitiesTimer->startTiming(); $entityFactory = EntityFactory::getInstance(); @@ -2265,7 +2264,7 @@ class World implements ChunkManager{ }elseif($saveIdTag instanceof IntTag){ //legacy MCPE format $saveId = "legacy(" . $saveIdTag->getValue() . ")"; } - $this->getLogger()->warning("Chunk " . $chunk->getX() . " " . $chunk->getZ() . ": Deleted unknown entity type $saveId"); + $this->getLogger()->warning("Chunk $chunkX $chunkZ: Deleted unknown entity type $saveId"); continue; } }catch(\Exception $t){ //TODO: this shouldn't be here @@ -2285,7 +2284,7 @@ class World implements ChunkManager{ if(($tile = $tileFactory->createFromData($this, $nbt)) !== null){ $this->addTile($tile); }else{ - $this->getLogger()->warning("Chunk " . $chunk->getX() . " " . $chunk->getZ() . ": Deleted unknown tile entity type " . $nbt->getString("id", "")); + $this->getLogger()->warning("Chunk $chunkX $chunkZ: Deleted unknown tile entity type " . $nbt->getString("id", "")); continue; } } @@ -2330,7 +2329,7 @@ class World implements ChunkManager{ $chunk = $this->chunks[$chunkHash] ?? null; if($chunk !== null){ - $ev = new ChunkUnloadEvent($this, $chunk); + $ev = new ChunkUnloadEvent($this, $x, $z, $chunk); $ev->call(); if($ev->isCancelled()){ $this->timings->doChunkUnload->stopTiming(); @@ -2341,14 +2340,14 @@ class World implements ChunkManager{ if($trySave and $this->getAutoSave() and $chunk->isGenerated() and $chunk->isDirty()){ $this->timings->syncChunkSaveTimer->startTiming(); try{ - $this->provider->saveChunk($chunk); + $this->provider->saveChunk($x, $z, $chunk); }finally{ $this->timings->syncChunkSaveTimer->stopTiming(); } } foreach($this->getChunkListeners($x, $z) as $listener){ - $listener->onChunkUnloaded($chunk); + $listener->onChunkUnloaded($x, $z, $chunk); } $chunk->onUnload(); @@ -2509,7 +2508,7 @@ class World implements ChunkManager{ $chunk = $this->loadChunk($x, $z); if($chunk === null){ - $chunk = new Chunk($x, $z); + $chunk = new Chunk(); } if(!$chunk->isPopulated()){ Timings::$populationTimer->startTiming(); @@ -2521,7 +2520,7 @@ class World implements ChunkManager{ } } - $task = new PopulationTask($this, $chunk); + $task = new PopulationTask($this, $x, $z, $chunk); $workerId = $this->workerPool->selectWorker(); if(!isset($this->generatorRegisteredWorkers[$workerId])){ $this->registerGeneratorToWorker($workerId); diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index c18dc0654..beb215544 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -45,11 +45,6 @@ class Chunk{ public const MAX_SUBCHUNKS = 16; - /** @var int */ - protected $x; - /** @var int */ - protected $z; - /** @var int */ private $dirtyFlags = 0; @@ -89,10 +84,7 @@ class Chunk{ * @param CompoundTag[] $entities * @param CompoundTag[] $tiles */ - public function __construct(int $chunkX, int $chunkZ, array $subChunks = [], ?array $entities = null, ?array $tiles = null, ?BiomeArray $biomeIds = null, ?HeightArray $heightMap = null){ - $this->x = $chunkX; - $this->z = $chunkZ; - + public function __construct(array $subChunks = [], ?array $entities = null, ?array $tiles = null, ?BiomeArray $biomeIds = null, ?HeightArray $heightMap = null){ $this->subChunks = new \SplFixedArray(Chunk::MAX_SUBCHUNKS); foreach($this->subChunks as $y => $null){ @@ -107,22 +99,6 @@ class Chunk{ $this->NBTentities = $entities; } - public function getX() : int{ - return $this->x; - } - - public function getZ() : int{ - return $this->z; - } - - public function setX(int $x) : void{ - $this->x = $x; - } - - public function setZ(int $z) : void{ - $this->z = $z; - } - /** * Returns the chunk height in count of subchunks. */ diff --git a/src/world/format/io/BaseWorldProvider.php b/src/world/format/io/BaseWorldProvider.php index c44bf7305..cc73a8145 100644 --- a/src/world/format/io/BaseWorldProvider.php +++ b/src/world/format/io/BaseWorldProvider.php @@ -66,11 +66,11 @@ abstract class BaseWorldProvider implements WorldProvider{ return $this->readChunk($chunkX, $chunkZ); } - public function saveChunk(Chunk $chunk) : void{ + public function saveChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void{ if(!$chunk->isGenerated()){ throw new \InvalidStateException("Cannot save un-generated chunk"); } - $this->writeChunk($chunk); + $this->writeChunk($chunkX, $chunkZ, $chunk); } /** @@ -78,5 +78,5 @@ abstract class BaseWorldProvider implements WorldProvider{ */ abstract protected function readChunk(int $chunkX, int $chunkZ) : ?Chunk; - abstract protected function writeChunk(Chunk $chunk) : void; + abstract protected function writeChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void; } diff --git a/src/world/format/io/FastChunkSerializer.php b/src/world/format/io/FastChunkSerializer.php index 3151a7bb6..16ef05d04 100644 --- a/src/world/format/io/FastChunkSerializer.php +++ b/src/world/format/io/FastChunkSerializer.php @@ -107,7 +107,7 @@ final class FastChunkSerializer{ /** * Deserializes a fast-serialized chunk */ - public static function deserialize(string $data, int $chunkX, int $chunkZ) : Chunk{ + public static function deserialize(string $data) : Chunk{ $stream = new BinaryStream($data); $flags = $stream->getByte(); @@ -144,7 +144,7 @@ final class FastChunkSerializer{ } } - $chunk = new Chunk($chunkX, $chunkZ, $subChunks, null, null, $biomeIds, $heightMap); + $chunk = new Chunk($subChunks, null, null, $biomeIds, $heightMap); $chunk->setGenerated($terrainGenerated); $chunk->setPopulated($terrainPopulated); $chunk->setLightPopulated($lightPopulated); diff --git a/src/world/format/io/FormatConverter.php b/src/world/format/io/FormatConverter.php index 70f83cf79..7e5bb4702 100644 --- a/src/world/format/io/FormatConverter.php +++ b/src/world/format/io/FormatConverter.php @@ -138,9 +138,10 @@ class FormatConverter{ $start = microtime(true); $thisRound = $start; - foreach($this->oldProvider->getAllChunks(true, $this->logger) as $chunk){ + foreach($this->oldProvider->getAllChunks(true, $this->logger) as $coords => $chunk){ + [$chunkX, $chunkZ] = $coords; $chunk->setDirty(); - $new->saveChunk($chunk); + $new->saveChunk($chunkX, $chunkZ, $chunk); $counter++; if(($counter % $this->chunksPerProgressUpdate) === 0){ $time = microtime(true); diff --git a/src/world/format/io/WorldProvider.php b/src/world/format/io/WorldProvider.php index a81e0e5df..d2c858475 100644 --- a/src/world/format/io/WorldProvider.php +++ b/src/world/format/io/WorldProvider.php @@ -75,6 +75,7 @@ interface WorldProvider{ * Returns a generator which yields all the chunks in this world. * * @return \Generator|Chunk[] + * @phpstan-return \Generator * @throws CorruptedChunkException */ public function getAllChunks(bool $skipCorrupted = false, ?\Logger $logger = null) : \Generator; diff --git a/src/world/format/io/WritableWorldProvider.php b/src/world/format/io/WritableWorldProvider.php index 82c127f3c..58ceef442 100644 --- a/src/world/format/io/WritableWorldProvider.php +++ b/src/world/format/io/WritableWorldProvider.php @@ -39,5 +39,5 @@ interface WritableWorldProvider extends WorldProvider{ /** * Saves a chunk (usually to disk). */ - public function saveChunk(Chunk $chunk) : void; + public function saveChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void; } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 25512b341..e54e51f04 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -398,8 +398,6 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ } $chunk = new Chunk( - $chunkX, - $chunkZ, $subChunks, $entities, $tiles, @@ -417,9 +415,9 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ return $chunk; } - protected function writeChunk(Chunk $chunk) : void{ + protected function writeChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void{ $idMap = LegacyBlockIdToStringIdMap::getInstance(); - $index = LevelDB::chunkIndex($chunk->getX(), $chunk->getZ()); + $index = LevelDB::chunkIndex($chunkX, $chunkZ); $write = new \LevelDBWriteBatch(); $write->put($index . self::TAG_VERSION, chr(self::CURRENT_LEVEL_CHUNK_VERSION)); @@ -509,7 +507,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $chunkZ = Binary::readLInt(substr($key, 4, 4)); try{ if(($chunk = $this->loadChunk($chunkX, $chunkZ)) !== null){ - yield $chunk; + yield [$chunkX, $chunkZ] => $chunk; } }catch(CorruptedChunkException $e){ if(!$skipCorrupted){ diff --git a/src/world/format/io/region/LegacyAnvilChunkTrait.php b/src/world/format/io/region/LegacyAnvilChunkTrait.php index 96c5e4180..893db968e 100644 --- a/src/world/format/io/region/LegacyAnvilChunkTrait.php +++ b/src/world/format/io/region/LegacyAnvilChunkTrait.php @@ -93,8 +93,6 @@ trait LegacyAnvilChunkTrait{ } $result = new Chunk( - $chunk->getInt("xPos"), - $chunk->getInt("zPos"), $subChunks, ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index 78288b699..d912202d2 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -89,8 +89,6 @@ class McRegion extends RegionWorldProvider{ } $result = new Chunk( - $chunk->getInt("xPos"), - $chunk->getInt("zPos"), $subChunks, ($entitiesTag = $chunk->getTag("Entities")) instanceof ListTag ? self::getCompoundList("Entities", $entitiesTag) : [], ($tilesTag = $chunk->getTag("TileEntities")) instanceof ListTag ? self::getCompoundList("TileEntities", $tilesTag) : [], diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index fa2162fe1..bfd505197 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -228,10 +228,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ return null; } - protected function writeChunk(Chunk $chunk) : void{ - $chunkX = $chunk->getX(); - $chunkZ = $chunk->getZ(); - + protected function writeChunk(int $chunkX, int $chunkZ, Chunk $chunk) : void{ self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ); $this->loadRegion($regionX, $regionZ); @@ -263,7 +260,7 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ try{ $chunk = $this->loadChunk($chunkX, $chunkZ); if($chunk !== null){ - yield $chunk; + yield [$chunkX, $chunkZ] => $chunk; } }catch(CorruptedChunkException $e){ if(!$skipCorrupted){ diff --git a/src/world/generator/Flat.php b/src/world/generator/Flat.php index dfa045820..2bd8b9c50 100644 --- a/src/world/generator/Flat.php +++ b/src/world/generator/Flat.php @@ -145,7 +145,7 @@ class Flat extends Generator{ } protected function generateBaseChunk() : void{ - $this->chunk = new Chunk(0, 0); + $this->chunk = new Chunk(); $this->chunk->setGenerated(); for($Z = 0; $Z < 16; ++$Z){ @@ -170,10 +170,7 @@ class Flat extends Generator{ } public function generateChunk(ChunkManager $world, int $chunkX, int $chunkZ) : void{ - $chunk = clone $this->chunk; - $chunk->setX($chunkX); - $chunk->setZ($chunkZ); - $world->setChunk($chunkX, $chunkZ, $chunk); + $world->setChunk($chunkX, $chunkZ, clone $this->chunk); } public function populateChunk(ChunkManager $world, int $chunkX, int $chunkZ) : void{ diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index fcee7cd24..a3caf538a 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -65,14 +65,14 @@ class PopulationTask extends AsyncTask{ /** @var string */ public $chunk8; - public function __construct(World $world, Chunk $chunk){ + public function __construct(World $world, int $chunkX, int $chunkZ, Chunk $chunk){ $this->state = true; $this->worldId = $world->getId(); - $this->chunkX = $chunk->getX(); - $this->chunkZ = $chunk->getZ(); + $this->chunkX = $chunkX; + $this->chunkZ = $chunkZ; $this->chunk = FastChunkSerializer::serializeWithoutLight($chunk); - foreach($world->getAdjacentChunks($chunk->getX(), $chunk->getZ()) as $i => $c){ + foreach($world->getAdjacentChunks($chunkX, $chunkZ) as $i => $c){ $this->{"chunk$i"} = $c !== null ? FastChunkSerializer::serializeWithoutLight($c) : null; } @@ -91,40 +91,40 @@ class PopulationTask extends AsyncTask{ /** @var Chunk[] $chunks */ $chunks = []; - $chunk = FastChunkSerializer::deserialize($this->chunk, $this->chunkX, $this->chunkZ); + $chunk = FastChunkSerializer::deserialize($this->chunk); for($i = 0; $i < 9; ++$i){ if($i === 4){ continue; } - $xx = -1 + $i % 3; - $zz = -1 + (int) ($i / 3); $ck = $this->{"chunk$i"}; if($ck === null){ - $chunks[$i] = new Chunk($this->chunkX + $xx, $this->chunkZ + $zz); + $chunks[$i] = new Chunk(); }else{ - $chunks[$i] = FastChunkSerializer::deserialize($ck, $this->chunkX + $xx, $this->chunkZ + $zz); + $chunks[$i] = FastChunkSerializer::deserialize($ck); } } - $manager->setChunk($chunk->getX(), $chunk->getZ(), $chunk); + $manager->setChunk($this->chunkX, $this->chunkZ, $chunk); if(!$chunk->isGenerated()){ - $generator->generateChunk($manager, $chunk->getX(), $chunk->getZ()); - $chunk = $manager->getChunk($chunk->getX(), $chunk->getZ()); + $generator->generateChunk($manager, $this->chunkX, $this->chunkZ); + $chunk = $manager->getChunk($this->chunkX, $this->chunkZ); $chunk->setGenerated(); } foreach($chunks as $i => $c){ - $manager->setChunk($c->getX(), $c->getZ(), $c); + $cX = (-1 + $i % 3) + $this->chunkX; + $cZ = (-1 + intdiv($i, 3)) + $this->chunkZ; + $manager->setChunk($cX, $cZ, $c); if(!$c->isGenerated()){ - $generator->generateChunk($manager, $c->getX(), $c->getZ()); - $chunks[$i] = $manager->getChunk($c->getX(), $c->getZ()); + $generator->generateChunk($manager, $cX, $cZ); + $chunks[$i] = $manager->getChunk($cX, $cZ); $chunks[$i]->setGenerated(); } } - $generator->populateChunk($manager, $chunk->getX(), $chunk->getZ()); - $chunk = $manager->getChunk($chunk->getX(), $chunk->getZ()); + $generator->populateChunk($manager, $this->chunkX, $this->chunkZ); + $chunk = $manager->getChunk($this->chunkX, $this->chunkZ); $chunk->setPopulated(); $this->chunk = FastChunkSerializer::serializeWithoutLight($chunk); @@ -142,7 +142,7 @@ class PopulationTask extends AsyncTask{ $world->registerGeneratorToWorker($this->worker->getAsyncWorkerId()); } - $chunk = FastChunkSerializer::deserialize($this->chunk, $this->chunkX, $this->chunkZ); + $chunk = FastChunkSerializer::deserialize($this->chunk); for($i = 0; $i < 9; ++$i){ if($i === 4){ @@ -153,7 +153,7 @@ class PopulationTask extends AsyncTask{ $xx = -1 + $i % 3; $zz = -1 + intdiv($i, 3); - $c = FastChunkSerializer::deserialize($c, $this->chunkX + $xx, $this->chunkZ + $zz); + $c = FastChunkSerializer::deserialize($c); $world->generateChunkCallback($this->chunkX + $xx, $this->chunkZ + $zz, $this->state ? $c : null); } } diff --git a/src/world/light/LightPopulationTask.php b/src/world/light/LightPopulationTask.php index 3f5c59a29..f69ac46a9 100644 --- a/src/world/light/LightPopulationTask.php +++ b/src/world/light/LightPopulationTask.php @@ -52,15 +52,15 @@ class LightPopulationTask extends AsyncTask{ /** @var string */ private $resultBlockLightArrays; - public function __construct(World $world, Chunk $chunk){ + public function __construct(World $world, int $chunkX, int $chunkZ, Chunk $chunk){ $this->storeLocal(self::TLS_KEY_WORLD, $world); - [$this->chunkX, $this->chunkZ] = [$chunk->getX(), $chunk->getZ()]; + [$this->chunkX, $this->chunkZ] = [$chunkX, $chunkZ]; $chunk->setLightPopulated(null); $this->chunk = FastChunkSerializer::serialize($chunk); } public function onRun() : void{ - $chunk = FastChunkSerializer::deserialize($this->chunk, $this->chunkX, $this->chunkZ); + $chunk = FastChunkSerializer::deserialize($this->chunk); $manager = new SimpleChunkManager(); $manager->setChunk($this->chunkX, $this->chunkZ, $chunk); diff --git a/tests/phpstan/configs/l8-baseline.neon b/tests/phpstan/configs/l8-baseline.neon index e7f7642c4..baca76de0 100644 --- a/tests/phpstan/configs/l8-baseline.neon +++ b/tests/phpstan/configs/l8-baseline.neon @@ -526,7 +526,7 @@ parameters: path: ../../../src/world/Explosion.php - - message: "#^Parameter \\#1 \\$chunk of method pocketmine\\\\player\\\\Player\\:\\:onChunkChanged\\(\\) expects pocketmine\\\\world\\\\format\\\\Chunk, pocketmine\\\\world\\\\format\\\\Chunk\\|null given\\.$#" + message: "#^Parameter \\#3 \\$chunk of method pocketmine\\\\player\\\\Player\\:\\:onChunkChanged\\(\\) expects pocketmine\\\\world\\\\format\\\\Chunk, pocketmine\\\\world\\\\format\\\\Chunk\\|null given\\.$#" count: 1 path: ../../../src/world/World.php @@ -595,16 +595,6 @@ parameters: count: 2 path: ../../../src/world/generator/PopulationTask.php - - - message: "#^Cannot call method getX\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 5 - path: ../../../src/world/generator/PopulationTask.php - - - - message: "#^Cannot call method getZ\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" - count: 5 - path: ../../../src/world/generator/PopulationTask.php - - message: "#^Cannot call method isGenerated\\(\\) on pocketmine\\\\world\\\\format\\\\Chunk\\|null\\.$#" count: 1 diff --git a/tests/phpunit/world/format/ChunkTest.php b/tests/phpunit/world/format/ChunkTest.php index 17d277b52..c557c65c3 100644 --- a/tests/phpunit/world/format/ChunkTest.php +++ b/tests/phpunit/world/format/ChunkTest.php @@ -28,7 +28,7 @@ use PHPUnit\Framework\TestCase; class ChunkTest extends TestCase{ public function testClone() : void{ - $chunk = new Chunk(0, 0); + $chunk = new Chunk(); $chunk->setFullBlock(0, 0, 0, 1); $chunk->setBiomeId(0, 0, 1); $chunk->setHeightMap(0, 0, 1);