diff --git a/.github/ISSUE_TEMPLATE/crash.md b/.github/ISSUE_TEMPLATE/crash.md index 7bcf5f4c2..ee91d230e 100644 --- a/.github/ISSUE_TEMPLATE/crash.md +++ b/.github/ISSUE_TEMPLATE/crash.md @@ -9,6 +9,7 @@ assignees: '' + Link to crashdump: diff --git a/src/event/player/PlayerCreationEvent.php b/src/event/player/PlayerCreationEvent.php index f9ed28807..d4056ee12 100644 --- a/src/event/player/PlayerCreationEvent.php +++ b/src/event/player/PlayerCreationEvent.php @@ -36,9 +36,15 @@ class PlayerCreationEvent extends Event{ /** @var NetworkSession */ private $session; - /** @var string */ + /** + * @var string + * @phpstan-var class-string + */ private $baseClass = Player::class; - /** @var string */ + /** + * @var string + * @phpstan-var class-string + */ private $playerClass = Player::class; public function __construct(NetworkSession $session){ @@ -59,6 +65,7 @@ class PlayerCreationEvent extends Event{ /** * @return string + * @phpstan-return class-string */ public function getBaseClass(){ return $this->baseClass; @@ -66,6 +73,7 @@ class PlayerCreationEvent extends Event{ /** * @param string $class + * @phpstan-param class-string $class */ public function setBaseClass($class) : void{ if(!is_a($class, $this->baseClass, true)){ @@ -77,6 +85,7 @@ class PlayerCreationEvent extends Event{ /** * @return string + * @phpstan-return class-string */ public function getPlayerClass(){ return $this->playerClass; @@ -84,6 +93,7 @@ class PlayerCreationEvent extends Event{ /** * @param string $class + * @phpstan-param class-string $class */ public function setPlayerClass($class) : void{ if(!is_a($class, $this->baseClass, true)){ diff --git a/src/permission/PermissionAttachment.php b/src/permission/PermissionAttachment.php index ae736377a..7caad254c 100644 --- a/src/permission/PermissionAttachment.php +++ b/src/permission/PermissionAttachment.php @@ -108,7 +108,16 @@ class PermissionAttachment{ if($this->permissions[$name] === $value){ return; } - unset($this->permissions[$name]); //Fixes children getting overwritten + /* Because of the way child permissions are calculated, permissions which were set later in time are + * preferred over earlier ones when conflicts in inherited permission values occur. + * Here's the kicker: This behaviour depends on PHP's internal array ordering, which maintains insertion + * order -- BUT -- assigning to an existing index replaces the old value WITHOUT changing the order. + * (what crazy person thought relying on this this was a good idea?!?!?!?!?!) + * + * This removes the old value so that the new value will be added at the end of the array's internal order + * instead of directly taking the place of the older value. + */ + unset($this->permissions[$name]); } $this->permissions[$name] = $value; $this->permissible->recalculatePermissions(); diff --git a/src/permission/PermissionManager.php b/src/permission/PermissionManager.php index 9483a3b30..678128159 100644 --- a/src/permission/PermissionManager.php +++ b/src/permission/PermissionManager.php @@ -143,7 +143,7 @@ class PermissionManager{ } /** - * @return array|Permissible[] + * @return Permissible[] */ public function getPermissionSubscriptions(string $permission) : array{ return $this->permSubs[$permission] ?? [];