diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index ec5cb174b9..082ebdb757 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1613,7 +1613,6 @@ class Server{ register_shutdown_function([$this, "crashDump"]); $this->queryRegenerateTask = new QueryRegenerateEvent($this, 5); - $this->network->registerInterface(new RakLibInterface($this)); $this->pluginManager->loadPlugins($this->pluginPath); @@ -1621,6 +1620,9 @@ class Server{ $this->enablePlugins(PluginLoadOrder::STARTUP); + $this->network->registerInterface(new RakLibInterface($this)); + + LevelProviderManager::addProvider(Anvil::class); LevelProviderManager::addProvider(McRegion::class); LevelProviderManager::addProvider(PMAnvil::class); diff --git a/src/pocketmine/event/server/NetworkInterfaceCrashEvent.php b/src/pocketmine/event/server/NetworkInterfaceCrashEvent.php new file mode 100644 index 0000000000..5bc8a4bdca --- /dev/null +++ b/src/pocketmine/event/server/NetworkInterfaceCrashEvent.php @@ -0,0 +1,50 @@ +exception = $throwable; + } + + /** + * @return \Throwable + */ + public function getCrashInformation() : \Throwable{ + return $this->exception; + } +} \ No newline at end of file diff --git a/src/pocketmine/event/server/NetworkInterfaceEvent.php b/src/pocketmine/event/server/NetworkInterfaceEvent.php new file mode 100644 index 0000000000..73965d75c7 --- /dev/null +++ b/src/pocketmine/event/server/NetworkInterfaceEvent.php @@ -0,0 +1,45 @@ +interface = $interface; + } + + /** + * @return SourceInterface + */ + public function getInterface() : SourceInterface{ + return $this->interface; + } +} \ No newline at end of file diff --git a/src/pocketmine/event/server/NetworkInterfaceRegisterEvent.php b/src/pocketmine/event/server/NetworkInterfaceRegisterEvent.php new file mode 100644 index 0000000000..d127f8bbaf --- /dev/null +++ b/src/pocketmine/event/server/NetworkInterfaceRegisterEvent.php @@ -0,0 +1,35 @@ +logException($e); } + $this->server->getPluginManager()->callEvent(new NetworkInterfaceCrashEvent($interface, $e)); + $interface->emergencyShutdown(); $this->unregisterInterface($interface); $logger->critical($this->server->getLanguage()->translateString("pocketmine.server.networkError", [get_class($interface), $e->getMessage()])); @@ -101,20 +106,24 @@ class Network{ * @param SourceInterface $interface */ public function registerInterface(SourceInterface $interface){ - $this->interfaces[$hash = spl_object_hash($interface)] = $interface; - if($interface instanceof AdvancedSourceInterface){ - $this->advancedInterfaces[$hash] = $interface; - $interface->setNetwork($this); + $this->server->getPluginManager()->callEvent($ev = new NetworkInterfaceRegisterEvent($interface)); + if(!$ev->isCancelled()){ + $interface->start(); + $this->interfaces[$hash = spl_object_hash($interface)] = $interface; + if($interface instanceof AdvancedSourceInterface){ + $this->advancedInterfaces[$hash] = $interface; + $interface->setNetwork($this); + } + $interface->setName($this->name); } - $interface->setName($this->name); } /** * @param SourceInterface $interface */ public function unregisterInterface(SourceInterface $interface){ - unset($this->interfaces[$hash = spl_object_hash($interface)], - $this->advancedInterfaces[$hash]); + $this->server->getPluginManager()->callEvent(new NetworkInterfaceUnregisterEvent($interface)); + unset($this->interfaces[$hash = spl_object_hash($interface)], $this->advancedInterfaces[$hash]); } /** diff --git a/src/pocketmine/network/SourceInterface.php b/src/pocketmine/network/SourceInterface.php index 0b08e394d3..8b5259a920 100644 --- a/src/pocketmine/network/SourceInterface.php +++ b/src/pocketmine/network/SourceInterface.php @@ -34,6 +34,11 @@ use pocketmine\Player; */ interface SourceInterface{ + /** + * Performs actions needed to start the interface after it is registered. + */ + public function start(); + /** * Sends a DataPacket to the interface, returns an unique identifier for the packet if $needACK is true * diff --git a/src/pocketmine/network/mcpe/RakLibInterface.php b/src/pocketmine/network/mcpe/RakLibInterface.php index 4e82452537..77d4146ce2 100644 --- a/src/pocketmine/network/mcpe/RakLibInterface.php +++ b/src/pocketmine/network/mcpe/RakLibInterface.php @@ -67,10 +67,14 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ $this->server = $server; $this->identifiers = []; - $this->rakLib = new RakLibServer($this->server->getLogger(), $this->server->getLoader(), $this->server->getPort(), $this->server->getIp() === "" ? "0.0.0.0" : $this->server->getIp()); + $this->rakLib = new RakLibServer($this->server->getLogger(), $this->server->getLoader(), $this->server->getPort(), $this->server->getIp() === "" ? "0.0.0.0" : $this->server->getIp(), false); $this->interface = new ServerHandler($this->rakLib, $this); } + public function start(){ + $this->rakLib->start(); + } + public function setNetwork(Network $network){ $this->network = $network; } diff --git a/tests/preprocessor b/tests/preprocessor index 893b61f722..868a61e579 160000 --- a/tests/preprocessor +++ b/tests/preprocessor @@ -1 +1 @@ -Subproject commit 893b61f722f2b14b8a4ca5063eff5d89039b0b62 +Subproject commit 868a61e579f0d6e69f354a0fb5914dba7e92d084