Move event calling functionality to Event->call() method

This is dependent on the changes made in b1e0f82cbf. This now makes it possible to call events without fetching a Server reference, allowing to eliminate a vast array of Server dependencies.
This commit is contained in:
Dylan K. Taylor
2018-10-05 16:55:37 +01:00
parent b1e0f82cbf
commit 6efef3bbc7
2 changed files with 41 additions and 28 deletions

View File

@ -27,6 +27,9 @@ declare(strict_types=1);
namespace pocketmine\event;
abstract class Event{
private const MAX_EVENT_CALL_DEPTH = 50;
/** @var int */
private static $eventCallDepth = 1;
/** @var string|null */
protected $eventName = null;
@ -67,4 +70,38 @@ abstract class Event{
/** @var Event $this */
$this->isCancelled = $value;
}
/**
* Calls event handlers registered for this event.
*
* @throws \RuntimeException if event call recursion reaches the max depth limit
*
* @throws \ReflectionException
*/
public function call() : void{
if(self::$eventCallDepth >= self::MAX_EVENT_CALL_DEPTH){
//this exception will be caught by the parent event call if all else fails
throw new \RuntimeException("Recursive event call detected (reached max depth of " . self::MAX_EVENT_CALL_DEPTH . " calls)");
}
$handlerList = HandlerList::getHandlerListFor(get_class($this));
assert($handlerList !== null, "Called event should have a valid HandlerList");
++self::$eventCallDepth;
foreach(EventPriority::ALL as $priority){
$currentList = $handlerList;
while($currentList !== null){
foreach($currentList->getListenersByPriority($priority) as $registration){
if(!$registration->getPlugin()->isEnabled()){
continue;
}
$registration->callEvent($this);
}
$currentList = $currentList->getParent();
}
}
--self::$eventCallDepth;
}
}