From 2c6205e3f3b72d6f2bbe1b4499f0f4ba98efc86f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 6 Sep 2017 11:22:10 +0100 Subject: [PATCH] Added new events for network interface handling, close #1232 (#1250) Added - NetworkInterfaceRegisterEvent (cancellable) - NetworkInterfaceUnregisterEvent - NetworkInterfaceCrashEvent --- src/pocketmine/Server.php | 4 +- .../server/NetworkInterfaceCrashEvent.php | 50 +++++++++++++++++++ .../event/server/NetworkInterfaceEvent.php | 45 +++++++++++++++++ .../server/NetworkInterfaceRegisterEvent.php | 35 +++++++++++++ .../NetworkInterfaceUnregisterEvent.php | 32 ++++++++++++ src/pocketmine/network/Network.php | 23 ++++++--- src/pocketmine/network/SourceInterface.php | 5 ++ .../network/mcpe/RakLibInterface.php | 6 ++- 8 files changed, 191 insertions(+), 9 deletions(-) create mode 100644 src/pocketmine/event/server/NetworkInterfaceCrashEvent.php create mode 100644 src/pocketmine/event/server/NetworkInterfaceEvent.php create mode 100644 src/pocketmine/event/server/NetworkInterfaceRegisterEvent.php create mode 100644 src/pocketmine/event/server/NetworkInterfaceUnregisterEvent.php diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index ec5cb174b..082ebdb75 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 000000000..5bc8a4bdc --- /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 000000000..73965d75c --- /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 000000000..d127f8bba --- /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 0b08e394d..8b5259a92 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 4e8245253..77d4146ce 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; }