Muqsit / WorldStyler

Yet another World Editor plugin for PocketMine... except it's actually fast!
GNU Lesser General Public License v3.0
30 stars 6 forks source link

Loading large Schematic #20

Open benda95280 opened 4 years ago

benda95280 commented 4 years ago

Hello,

I've tried to load a 'Large' schematic (near 2Mb), and was having error like that :

2020-06-01 [22:26:40] [Server thread/CRITICAL]: Error: "Call to a member function getSubChunk() on null" (EXCEPTION) in "plugins/WorldStyler_dev-11.phar/src/muqsit/worldstyler/utils/BlockIterator" at line 17
2020-06-01 [22:26:40] [Server thread/DEBUG]: #0 plugins/WorldStyler_dev-11.phar/src/muqsit/worldstyler/schematics/Schematic(89): muqsit\worldstyler\utils\BlockIterator->moveTo(integer 352, integer 65, integer 448)
2020-06-01 [22:26:40] [Server thread/DEBUG]: #1 plugins/WorldStyler_dev-11.phar/src/muqsit/worldstyler/executors/SchemCommandExecutor(75): muqsit\worldstyler\schematics\Schematic->paste(object pocketmine\level\Level, object pocketmine\math\Vector3, boolean 1, object Closure)
2020-06-01 [22:26:40] [Server thread/DEBUG]: #2 plugins/WorldStyler_dev-11.phar/src/muqsit/worldstyler/executors/BaseCommandExecutor(85): muqsit\worldstyler\executors\SchemCommandExecutor->onCommandExecute(object pocketmine\Player, object pocketmine\command\PluginCommand, string[6] /schem, array[2], array[0])

I've been able to fix it by do a modification on "BlockIterator.php" :

            if (!$this->level->isChunkLoaded( $this->currentX, $this->currentZ )) {
                    $this->level->loadChunk ( $this->currentX, $this->currentZ );
            }
            $this->currentSubChunk = $this->level->getChunk($this->currentX, $this->currentZ)->getSubChunk($y >> 4, $this->allocateEmptySubs);
            return true;

But now, i've a message saying everything has been done, but there is missing parts. Tried multiple time, sometimes the result is not the same. The first time, never got the message saying it was finished ...

Is it possible to have support ? Minecraft 01_06_2020 23_56_40

benda95280 commented 4 years ago

New attempt to show difference : Minecraft 02_06_2020 00_02_02 Minecraft 02_06_2020 00_03_03

jasonw4331 commented 4 years ago

Increase your maximum memory allocation in the pocketmine.yml

benda95280 commented 4 years ago

Already done (While trying to get it works with others plugins). WorldStyler do not use so much memory, other plugins was over 3Gb of memory and crash) Currently it's 4GB in PHP and PocketMine configuration files.

benda95280 commented 4 years ago

Tried to add a pause after LoadChuck, result is always different

Muqsit commented 4 years ago

There isn't really an easy way to solve this. Chunk generation is asynchronous. The plugin would need to wait until the chunk being modified is generated so the world generator doesn't overwrite the changes - will need to probably do something that https://github.com/Wumpotamus/libChunkLoader does.

benda95280 commented 4 years ago

I'm not able to understand/find a way how to implement it :/

benda95280 commented 4 years ago

Tried implentation like that in Schematic.php, line 90 :

                    $yPos = $y + $rely;
                    ChunkRegion::onChunkGenerated($level, $xPos >> 4, $zPos >> 4, function() use($iterator, $xPos, $yPos, $zPos, $id, $damage){
                        $iterator->moveTo($xPos, $yPos, $zPos);
                        $iterator->currentSubChunk->setBlock($xPos & 0x0f, $yPos & 0x0f, $zPos & 0x0f, $id, $damage);
                    });

image

After, server shutdown when over 4Gb of memory ...

EDIT: It seems to have done near 1/4 of the work : Minecraft 02_06_2020 18_13_24

benda95280 commented 4 years ago

21 => Seems to be able to load near everything !

Minecraft 03_06_2020 01_18_43