classLoader; } public function setClassLoader(\ClassLoader $loader = null){ $this->composerAutoloaderPath = \pocketmine\COMPOSER_AUTOLOADER_PATH; if($loader === null){ $loader = Server::getInstance()->getLoader(); } $this->classLoader = $loader; } /** * Registers the class loader for this thread. * * WARNING: This method MUST be called from any descendent threads' run() method to make autoloading usable. * If you do not do this, you will not be able to use new classes that were not loaded when the thread was started * (unless you are using a custom autoloader). */ public function registerClassLoader(){ if($this->composerAutoloaderPath !== null){ require $this->composerAutoloaderPath; } if($this->classLoader !== null){ $this->classLoader->register(false); } } public function start(?int $options = \PTHREADS_INHERIT_ALL){ ThreadManager::getInstance()->add($this); if($this->getClassLoader() === null){ $this->setClassLoader(); } return parent::start($options); } /** * Stops the thread using the best way possible. Try to stop it yourself before calling this. */ public function quit(){ $this->isKilled = true; if($this->isRunning()){ while($this->unstack() !== null); $this->notify(); $this->shutdown(); } ThreadManager::getInstance()->remove($this); } public function getThreadName() : string{ return (new \ReflectionClass($this))->getShortName(); } }