Implemented event handler inheritance, allow registering handlers for any valid event (#1792)

* Event handlers always handle subclass events. public static $handlerList no longer required.
* Removed $handlerList declarations
* HandlerList cleanup: Removed HandlerList->handlers and related bake methods
* Removed obsolete Event->getHandlers()
* EventPriority: Added fromString()
* PluginManager: throw exceptions on registering handlers with invalid priorities

This allows specifying a handler of `EntityDamageEvent` which will handle any instanceof it (as per current behaviour), AND also now allows specifying a handler specifically for `EntityDamageByEntityEvent`, which only handles `EntityDamageEvent`.

This was not previously possible due to limitations in the way handlers were registered.

Abstract events may not be handled unless they declare the `@allowHandle` PhpDoc tag.
This commit is contained in:
SOFe
2018-03-21 01:05:09 +08:00
committed by Dylan K. Taylor
parent 1648fff916
commit 49fbbea7bf
106 changed files with 204 additions and 363 deletions

View File

@ -33,6 +33,15 @@ namespace pocketmine\event;
* MONITOR events should not change the event outcome or contents
*/
abstract class EventPriority{
public const ALL = [
self::LOWEST,
self::LOW,
self::NORMAL,
self::HIGH,
self::HIGHEST,
self::MONITOR
];
/**
* Event call is of very low importance and should be ran first, to allow
* other plugins to further customise the outcome
@ -43,7 +52,8 @@ abstract class EventPriority{
*/
public const LOW = 4;
/**
* Event call is neither important or unimportant, and may be ran normally
* Event call is neither important or unimportant, and may be ran normally.
* This is the default priority.
*/
public const NORMAL = 3;
/**
@ -62,4 +72,20 @@ abstract class EventPriority{
*/
public const MONITOR = 0;
/**
* @param string $name
*
* @return int
*
* @throws \InvalidArgumentException
*/
public static function fromString(string $name) : int{
$name = strtoupper($name);
$const = self::class . "::" . $name;
if($name !== "ALL" and \defined($const)){
return \constant($const);
}
throw new \InvalidArgumentException("Unable to resolve priority \"$name\"");
}
}