diff --git a/src/command/defaults/ClearCommand.php b/src/command/defaults/ClearCommand.php index 7acd03ea7..bb8b8d3c3 100644 --- a/src/command/defaults/ClearCommand.php +++ b/src/command/defaults/ClearCommand.php @@ -33,7 +33,6 @@ use pocketmine\item\LegacyStringToItemParserException; use pocketmine\item\StringToItemParser; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; -use pocketmine\player\Player; use pocketmine\utils\TextFormat; use function count; use function implode; @@ -55,23 +54,9 @@ class ClearCommand extends VanillaCommand{ throw new InvalidCommandSyntaxException(); } - if(isset($args[0])){ - $target = $sender->getServer()->getPlayerByPrefix($args[0]); - if($target === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); - return true; - } - if($target !== $sender && !$this->testPermission($sender, DefaultPermissionNames::COMMAND_CLEAR_OTHER)){ - return true; - } - }elseif($sender instanceof Player){ - if(!$this->testPermission($sender, DefaultPermissionNames::COMMAND_CLEAR_SELF)){ - return true; - } - - $target = $sender; - }else{ - throw new InvalidCommandSyntaxException(); + $target = $this->fetchPermittedPlayerTarget($sender, $args[0] ?? null, DefaultPermissionNames::COMMAND_CLEAR_SELF, DefaultPermissionNames::COMMAND_CLEAR_OTHER); + if($target === null){ + return true; } $targetItem = null; diff --git a/src/command/defaults/EffectCommand.php b/src/command/defaults/EffectCommand.php index 5339f4a5b..566861bd3 100644 --- a/src/command/defaults/EffectCommand.php +++ b/src/command/defaults/EffectCommand.php @@ -32,6 +32,7 @@ use pocketmine\permission\DefaultPermissionNames; use pocketmine\utils\Limits; use pocketmine\utils\TextFormat; use function count; +use function implode; use function strtolower; class EffectCommand extends VanillaCommand{ @@ -42,7 +43,10 @@ class EffectCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_effect_description(), KnownTranslationFactory::commands_effect_usage() ); - $this->setPermission(DefaultPermissionNames::COMMAND_EFFECT); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_EFFECT_SELF, + DefaultPermissionNames::COMMAND_EFFECT_OTHER + ])); } public function execute(CommandSender $sender, string $commandLabel, array $args){ @@ -50,10 +54,8 @@ class EffectCommand extends VanillaCommand{ throw new InvalidCommandSyntaxException(); } - $player = $sender->getServer()->getPlayerByPrefix($args[0]); - + $player = $this->fetchPermittedPlayerTarget($sender, $args[0], DefaultPermissionNames::COMMAND_EFFECT_SELF, DefaultPermissionNames::COMMAND_EFFECT_OTHER); if($player === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); return true; } $effectManager = $player->getEffects(); diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index 64bb146bb..e81473f78 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -29,8 +29,8 @@ use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\item\enchantment\StringToEnchantmentParser; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; -use pocketmine\utils\TextFormat; use function count; +use function implode; class EnchantCommand extends VanillaCommand{ @@ -40,7 +40,10 @@ class EnchantCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_enchant_description(), KnownTranslationFactory::commands_enchant_usage() ); - $this->setPermission(DefaultPermissionNames::COMMAND_ENCHANT); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_ENCHANT_SELF, + DefaultPermissionNames::COMMAND_ENCHANT_OTHER + ])); } public function execute(CommandSender $sender, string $commandLabel, array $args){ @@ -48,10 +51,8 @@ class EnchantCommand extends VanillaCommand{ throw new InvalidCommandSyntaxException(); } - $player = $sender->getServer()->getPlayerByPrefix($args[0]); - + $player = $this->fetchPermittedPlayerTarget($sender, $args[0], DefaultPermissionNames::COMMAND_ENCHANT_SELF, DefaultPermissionNames::COMMAND_ENCHANT_OTHER); if($player === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); return true; } diff --git a/src/command/defaults/GamemodeCommand.php b/src/command/defaults/GamemodeCommand.php index 70ac6d1a6..2741101b6 100644 --- a/src/command/defaults/GamemodeCommand.php +++ b/src/command/defaults/GamemodeCommand.php @@ -29,9 +29,8 @@ use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\GameMode; -use pocketmine\player\Player; -use pocketmine\utils\TextFormat; use function count; +use function implode; class GamemodeCommand extends VanillaCommand{ @@ -41,7 +40,10 @@ class GamemodeCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_gamemode_description(), KnownTranslationFactory::commands_gamemode_usage() ); - $this->setPermission(DefaultPermissionNames::COMMAND_GAMEMODE); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_GAMEMODE_SELF, + DefaultPermissionNames::COMMAND_GAMEMODE_OTHER + ])); } public function execute(CommandSender $sender, string $commandLabel, array $args){ @@ -55,17 +57,9 @@ class GamemodeCommand extends VanillaCommand{ return true; } - if(isset($args[1])){ - $target = $sender->getServer()->getPlayerByPrefix($args[1]); - if($target === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); - - return true; - } - }elseif($sender instanceof Player){ - $target = $sender; - }else{ - throw new InvalidCommandSyntaxException(); + $target = $this->fetchPermittedPlayerTarget($sender, $args[1] ?? null, DefaultPermissionNames::COMMAND_GAMEMODE_SELF, DefaultPermissionNames::COMMAND_GAMEMODE_OTHER); + if($target === null){ + return true; } if($target->getGamemode()->equals($gameMode)){ diff --git a/src/command/defaults/GiveCommand.php b/src/command/defaults/GiveCommand.php index ed3e5df42..535627895 100644 --- a/src/command/defaults/GiveCommand.php +++ b/src/command/defaults/GiveCommand.php @@ -47,7 +47,10 @@ class GiveCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_give_description(), KnownTranslationFactory::pocketmine_command_give_usage() ); - $this->setPermission(DefaultPermissionNames::COMMAND_GIVE); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_GIVE_SELF, + DefaultPermissionNames::COMMAND_GIVE_OTHER + ])); } public function execute(CommandSender $sender, string $commandLabel, array $args){ @@ -55,9 +58,8 @@ class GiveCommand extends VanillaCommand{ throw new InvalidCommandSyntaxException(); } - $player = $sender->getServer()->getPlayerByPrefix($args[0]); + $player = $this->fetchPermittedPlayerTarget($sender, $args[0], DefaultPermissionNames::COMMAND_GIVE_SELF, DefaultPermissionNames::COMMAND_GIVE_OTHER); if($player === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); return true; } diff --git a/src/command/defaults/KillCommand.php b/src/command/defaults/KillCommand.php index eebabd3d9..6ee9e5ac9 100644 --- a/src/command/defaults/KillCommand.php +++ b/src/command/defaults/KillCommand.php @@ -29,8 +29,6 @@ use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; -use pocketmine\player\Player; -use pocketmine\utils\TextFormat; use function count; use function implode; @@ -51,32 +49,16 @@ class KillCommand extends VanillaCommand{ throw new InvalidCommandSyntaxException(); } - if(count($args) === 1){ - if(!$this->testPermission($sender, DefaultPermissionNames::COMMAND_KILL_OTHER)){ - return true; - } - - $player = $sender->getServer()->getPlayerByPrefix($args[0]); - - if($player instanceof Player){ - $player->attack(new EntityDamageEvent($player, EntityDamageEvent::CAUSE_SUICIDE, 1000)); - Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_kill_successful($player->getName())); - }else{ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); - } - + $player = $this->fetchPermittedPlayerTarget($sender, $args[0] ?? null, DefaultPermissionNames::COMMAND_KILL_SELF, DefaultPermissionNames::COMMAND_KILL_OTHER); + if($player === null){ return true; } - if($sender instanceof Player){ - if(!$this->testPermission($sender, DefaultPermissionNames::COMMAND_KILL_SELF)){ - return true; - } - - $sender->attack(new EntityDamageEvent($sender, EntityDamageEvent::CAUSE_SUICIDE, 1000)); + $player->attack(new EntityDamageEvent($player, EntityDamageEvent::CAUSE_SUICIDE, 1000)); + if($player === $sender){ $sender->sendMessage(KnownTranslationFactory::commands_kill_successful($sender->getName())); }else{ - throw new InvalidCommandSyntaxException(); + Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_kill_successful($player->getName())); } return true; diff --git a/src/command/defaults/SpawnpointCommand.php b/src/command/defaults/SpawnpointCommand.php index de8789e9a..445fea44f 100644 --- a/src/command/defaults/SpawnpointCommand.php +++ b/src/command/defaults/SpawnpointCommand.php @@ -29,10 +29,10 @@ use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\Player; -use pocketmine\utils\TextFormat; use pocketmine\world\Position; use pocketmine\world\World; use function count; +use function implode; use function round; class SpawnpointCommand extends VanillaCommand{ @@ -43,27 +43,16 @@ class SpawnpointCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_spawnpoint_description(), KnownTranslationFactory::commands_spawnpoint_usage() ); - $this->setPermission(DefaultPermissionNames::COMMAND_SPAWNPOINT); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, + DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER + ])); } public function execute(CommandSender $sender, string $commandLabel, array $args){ - $target = null; - - if(count($args) === 0){ - if($sender instanceof Player){ - $target = $sender; - }else{ - $sender->sendMessage(TextFormat::RED . "Please provide a player!"); - - return true; - } - }else{ - $target = $sender->getServer()->getPlayerByPrefix($args[0]); - if($target === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); - - return true; - } + $target = $this->fetchPermittedPlayerTarget($sender, $args[0] ?? null, DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER); + if($target === null){ + return true; } if(count($args) === 4){ @@ -77,19 +66,13 @@ class SpawnpointCommand extends VanillaCommand{ Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_spawnpoint_success($target->getName(), (string) round($x, 2), (string) round($y, 2), (string) round($z, 2))); return true; - }elseif(count($args) <= 1){ - if($sender instanceof Player){ - $cpos = $sender->getPosition(); - $pos = Position::fromObject($cpos->floor(), $cpos->getWorld()); - $target->setSpawn($pos); + }elseif(count($args) <= 1 && $sender instanceof Player){ + $cpos = $sender->getPosition(); + $pos = Position::fromObject($cpos->floor(), $cpos->getWorld()); + $target->setSpawn($pos); - Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_spawnpoint_success($target->getName(), (string) round($pos->x, 2), (string) round($pos->y, 2), (string) round($pos->z, 2))); - return true; - }else{ - $sender->sendMessage(TextFormat::RED . "Please provide a player!"); - - return true; - } + Command::broadcastCommandMessage($sender, KnownTranslationFactory::commands_spawnpoint_success($target->getName(), (string) round($pos->x, 2), (string) round($pos->y, 2), (string) round($pos->z, 2))); + return true; } throw new InvalidCommandSyntaxException(); diff --git a/src/command/defaults/TeleportCommand.php b/src/command/defaults/TeleportCommand.php index 5713ef231..7493347e8 100644 --- a/src/command/defaults/TeleportCommand.php +++ b/src/command/defaults/TeleportCommand.php @@ -35,6 +35,7 @@ use pocketmine\utils\TextFormat; use pocketmine\world\World; use function array_shift; use function count; +use function implode; use function round; class TeleportCommand extends VanillaCommand{ @@ -46,7 +47,10 @@ class TeleportCommand extends VanillaCommand{ KnownTranslationFactory::commands_tp_usage(), ["teleport"] ); - $this->setPermission(DefaultPermissionNames::COMMAND_TELEPORT); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_TELEPORT_SELF, + DefaultPermissionNames::COMMAND_TELEPORT_OTHER + ])); } private function findPlayer(CommandSender $sender, string $playerName) : ?Player{ @@ -63,31 +67,25 @@ class TeleportCommand extends VanillaCommand{ case 1: // /tp targetPlayer case 3: // /tp x y z case 5: // /tp x y z yaw pitch - TODO: 5 args could be target x y z yaw :( - if(!($sender instanceof Player)){ - $sender->sendMessage(TextFormat::RED . "Please provide a player!"); - return true; - } - - $subject = $sender; - $targetArgs = $args; + $subjectName = null; //self break; case 2: // /tp player1 player2 case 4: // /tp player1 x y z - TODO: 4 args could be x y z yaw :( case 6: // /tp player1 x y z yaw pitch - $subject = $this->findPlayer($sender, $args[0]); - if($subject === null){ - return true; - } - $targetArgs = $args; - array_shift($targetArgs); + $subjectName = array_shift($args); break; default: throw new InvalidCommandSyntaxException(); } - switch(count($targetArgs)){ + $subject = $this->fetchPermittedPlayerTarget($sender, $subjectName, DefaultPermissionNames::COMMAND_TELEPORT_SELF, DefaultPermissionNames::COMMAND_TELEPORT_OTHER); + if($subject === null){ + return true; + } + + switch(count($args)){ case 1: - $targetPlayer = $this->findPlayer($sender, $targetArgs[0]); + $targetPlayer = $this->findPlayer($sender, $args[0]); if($targetPlayer === null){ return true; } @@ -99,17 +97,17 @@ class TeleportCommand extends VanillaCommand{ case 3: case 5: $base = $subject->getLocation(); - if(count($targetArgs) === 5){ - $yaw = (float) $targetArgs[3]; - $pitch = (float) $targetArgs[4]; + if(count($args) === 5){ + $yaw = (float) $args[3]; + $pitch = (float) $args[4]; }else{ $yaw = $base->yaw; $pitch = $base->pitch; } - $x = $this->getRelativeDouble($base->x, $sender, $targetArgs[0]); - $y = $this->getRelativeDouble($base->y, $sender, $targetArgs[1], World::Y_MIN, World::Y_MAX); - $z = $this->getRelativeDouble($base->z, $sender, $targetArgs[2]); + $x = $this->getRelativeDouble($base->x, $sender, $args[0]); + $y = $this->getRelativeDouble($base->y, $sender, $args[1], World::Y_MIN, World::Y_MAX); + $z = $this->getRelativeDouble($base->z, $sender, $args[2]); $targetLocation = new Location($x, $y, $z, $base->getWorld(), $yaw, $pitch); $subject->teleport($targetLocation); diff --git a/src/command/defaults/TitleCommand.php b/src/command/defaults/TitleCommand.php index cf0670608..dfe24dc7b 100644 --- a/src/command/defaults/TitleCommand.php +++ b/src/command/defaults/TitleCommand.php @@ -27,7 +27,6 @@ use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; -use pocketmine\utils\TextFormat; use function array_slice; use function count; use function implode; @@ -40,7 +39,10 @@ class TitleCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_title_description(), KnownTranslationFactory::commands_title_usage() ); - $this->setPermission(DefaultPermissionNames::COMMAND_TITLE); + $this->setPermission(implode(";", [ + DefaultPermissionNames::COMMAND_TITLE_SELF, + DefaultPermissionNames::COMMAND_TITLE_OTHER + ])); } public function execute(CommandSender $sender, string $commandLabel, array $args){ @@ -48,9 +50,8 @@ class TitleCommand extends VanillaCommand{ throw new InvalidCommandSyntaxException(); } - $player = $sender->getServer()->getPlayerByPrefix($args[0]); + $player = $this->fetchPermittedPlayerTarget($sender, $args[0], DefaultPermissionNames::COMMAND_TITLE_SELF, DefaultPermissionNames::COMMAND_TITLE_OTHER); if($player === null){ - $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); return true; } diff --git a/src/command/defaults/VanillaCommand.php b/src/command/defaults/VanillaCommand.php index fbc7225bc..9bdd63739 100644 --- a/src/command/defaults/VanillaCommand.php +++ b/src/command/defaults/VanillaCommand.php @@ -27,6 +27,7 @@ use pocketmine\command\Command; use pocketmine\command\CommandSender; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; +use pocketmine\player\Player; use pocketmine\utils\TextFormat; use function is_numeric; use function substr; @@ -35,6 +36,28 @@ abstract class VanillaCommand extends Command{ public const MAX_COORD = 30000000; public const MIN_COORD = -30000000; + protected function fetchPermittedPlayerTarget(CommandSender $sender, ?string $target, string $selfPermission, string $otherPermission) : ?Player{ + if($target !== null){ + $player = $sender->getServer()->getPlayerByPrefix($target); + }elseif($sender instanceof Player){ + $player = $sender; + }else{ + throw new InvalidCommandSyntaxException(); + } + + if($player === null){ + $sender->sendMessage(KnownTranslationFactory::commands_generic_player_notFound()->prefix(TextFormat::RED)); + return null; + } + if( + ($player === $sender && $this->testPermission($sender, $selfPermission)) || + ($player !== $sender && $this->testPermission($sender, $otherPermission)) + ){ + return $player; + } + return null; + } + protected function getInteger(CommandSender $sender, string $value, int $min = self::MIN_COORD, int $max = self::MAX_COORD) : int{ $i = (int) $value; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index dd88a0a84..545dd6ddd 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -823,7 +823,7 @@ class NetworkSession{ UpdateAbilitiesPacketLayer::ABILITY_FLYING => $for->isFlying(), UpdateAbilitiesPacketLayer::ABILITY_NO_CLIP => !$for->hasBlockCollision(), UpdateAbilitiesPacketLayer::ABILITY_OPERATOR => $isOp, - UpdateAbilitiesPacketLayer::ABILITY_TELEPORT => $for->hasPermission(DefaultPermissionNames::COMMAND_TELEPORT), + UpdateAbilitiesPacketLayer::ABILITY_TELEPORT => $for->hasPermission(DefaultPermissionNames::COMMAND_TELEPORT_SELF), UpdateAbilitiesPacketLayer::ABILITY_INVULNERABLE => $for->isCreative(), UpdateAbilitiesPacketLayer::ABILITY_MUTED => false, UpdateAbilitiesPacketLayer::ABILITY_WORLD_BUILDER => false, diff --git a/src/permission/DefaultPermissionNames.php b/src/permission/DefaultPermissionNames.php index 9a506b520..6dc86c9ae 100644 --- a/src/permission/DefaultPermissionNames.php +++ b/src/permission/DefaultPermissionNames.php @@ -35,10 +35,18 @@ final class DefaultPermissionNames{ public const COMMAND_DIFFICULTY = "pocketmine.command.difficulty"; public const COMMAND_DUMPMEMORY = "pocketmine.command.dumpmemory"; public const COMMAND_EFFECT = "pocketmine.command.effect"; + public const COMMAND_EFFECT_OTHER = "pocketmine.command.effect.other"; + public const COMMAND_EFFECT_SELF = "pocketmine.command.effect.self"; public const COMMAND_ENCHANT = "pocketmine.command.enchant"; + public const COMMAND_ENCHANT_OTHER = "pocketmine.command.enchant.other"; + public const COMMAND_ENCHANT_SELF = "pocketmine.command.enchant.self"; public const COMMAND_GAMEMODE = "pocketmine.command.gamemode"; + public const COMMAND_GAMEMODE_OTHER = "pocketmine.command.gamemode.other"; + public const COMMAND_GAMEMODE_SELF = "pocketmine.command.gamemode.self"; public const COMMAND_GC = "pocketmine.command.gc"; public const COMMAND_GIVE = "pocketmine.command.give"; + public const COMMAND_GIVE_OTHER = "pocketmine.command.give.other"; + public const COMMAND_GIVE_SELF = "pocketmine.command.give.self"; public const COMMAND_HELP = "pocketmine.command.help"; public const COMMAND_KICK = "pocketmine.command.kick"; public const COMMAND_KILL_OTHER = "pocketmine.command.kill.other"; @@ -56,9 +64,13 @@ final class DefaultPermissionNames{ public const COMMAND_SEED = "pocketmine.command.seed"; public const COMMAND_SETWORLDSPAWN = "pocketmine.command.setworldspawn"; public const COMMAND_SPAWNPOINT = "pocketmine.command.spawnpoint"; + public const COMMAND_SPAWNPOINT_OTHER = "pocketmine.command.spawnpoint.other"; + public const COMMAND_SPAWNPOINT_SELF = "pocketmine.command.spawnpoint.self"; public const COMMAND_STATUS = "pocketmine.command.status"; public const COMMAND_STOP = "pocketmine.command.stop"; public const COMMAND_TELEPORT = "pocketmine.command.teleport"; + public const COMMAND_TELEPORT_OTHER = "pocketmine.command.teleport.other"; + public const COMMAND_TELEPORT_SELF = "pocketmine.command.teleport.self"; public const COMMAND_TELL = "pocketmine.command.tell"; public const COMMAND_TIME_ADD = "pocketmine.command.time.add"; public const COMMAND_TIME_QUERY = "pocketmine.command.time.query"; @@ -67,6 +79,8 @@ final class DefaultPermissionNames{ public const COMMAND_TIME_STOP = "pocketmine.command.time.stop"; public const COMMAND_TIMINGS = "pocketmine.command.timings"; public const COMMAND_TITLE = "pocketmine.command.title"; + public const COMMAND_TITLE_OTHER = "pocketmine.command.title.other"; + public const COMMAND_TITLE_SELF = "pocketmine.command.title.self"; public const COMMAND_TRANSFERSERVER = "pocketmine.command.transferserver"; public const COMMAND_UNBAN_IP = "pocketmine.command.unban.ip"; public const COMMAND_UNBAN_PLAYER = "pocketmine.command.unban.player"; diff --git a/src/permission/DefaultPermissions.php b/src/permission/DefaultPermissions.php index 9a2cb9347..6f9c79b80 100644 --- a/src/permission/DefaultPermissions.php +++ b/src/permission/DefaultPermissions.php @@ -44,6 +44,12 @@ abstract class DefaultPermissions{ return PermissionManager::getInstance()->getPermission($candidate->getName()); } + private static function registerDeprecatedPermission(string $name) : Permission{ + $permission = new Permission($name, "Deprecated, kept for backwards compatibility only"); + PermissionManager::getInstance()->addPermission($permission); + return $permission; + } + public static function registerCorePermissions() : void{ $consoleRoot = self::registerPermission(new Permission(self::ROOT_CONSOLE, "Grants all console permissions")); $operatorRoot = self::registerPermission(new Permission(self::ROOT_OPERATOR, "Grants all operator permissions"), [$consoleRoot]); @@ -59,11 +65,25 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_DEFAULTGAMEMODE, "Allows the user to change the default gamemode"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_DIFFICULTY, "Allows the user to change the game difficulty"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_DUMPMEMORY, "Allows the user to dump memory contents"), [$consoleRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT, "Allows the user to give/take potion effects"), [$operatorRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT, "Allows the user to enchant items"), [$operatorRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE, "Allows the user to change the gamemode of players"), [$operatorRoot]); + + $effectRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_EFFECT); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT_OTHER, "Allows the user to modify effects of other players"), [$operatorRoot, $effectRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_EFFECT_SELF, "Allows the user to modify their own effects"), [$operatorRoot, $effectRoot]); + + $enchantRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_ENCHANT); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT_OTHER, "Allows the user to enchant the held items of other players"), [$operatorRoot, $enchantRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_ENCHANT_SELF, "Allows the user to enchant their own held item"), [$operatorRoot, $enchantRoot]); + + $gameModeRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_GAMEMODE); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE_OTHER, "Allows the user to change the game mode of other players"), [$operatorRoot, $gameModeRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GAMEMODE_SELF, "Allows the user to change their own game mode"), [$operatorRoot, $gameModeRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GC, "Allows the user to fire garbage collection tasks"), [$operatorRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE, "Allows the user to give items to players"), [$operatorRoot]); + + $giveRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_GIVE); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE_OTHER, "Allows the user to give items to other players"), [$operatorRoot, $giveRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_GIVE_SELF, "Allows the user to give items to themselves"), [$operatorRoot, $giveRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_HELP, "Allows the user to view the help menu"), [$everyoneRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_KICK, "Allows the user to kick players"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_KILL_OTHER, "Allows the user to kill other players"), [$operatorRoot]); @@ -80,10 +100,18 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SAY, "Allows the user to talk as the console"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SEED, "Allows the user to view the seed of the world"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SETWORLDSPAWN, "Allows the user to change the world spawn"), [$operatorRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT, "Allows the user to change player's spawnpoint"), [$operatorRoot]); + + $spawnpointRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_SPAWNPOINT); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER, "Allows the user to change the respawn point of other players"), [$operatorRoot, $spawnpointRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, "Allows the user to change their own respawn point"), [$operatorRoot, $spawnpointRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_STATUS, "Allows the user to view the server performance"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_STOP, "Allows the user to stop the server"), [$operatorRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT, "Allows the user to teleport players"), [$operatorRoot]); + + $teleportRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_TELEPORT); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT_OTHER, "Allows the user to teleport other players"), [$operatorRoot, $teleportRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELEPORT_SELF, "Allows the user to teleport themselves"), [$operatorRoot, $teleportRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TELL, "Allows the user to privately message another player"), [$everyoneRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_ADD, "Allows the user to fast-forward time"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_QUERY, "Allows the user query the time"), [$operatorRoot]); @@ -91,7 +119,11 @@ abstract class DefaultPermissions{ self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_START, "Allows the user to restart the time"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIME_STOP, "Allows the user to stop the time"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TIMINGS, "Allows the user to record timings to analyse server performance"), [$operatorRoot]); - self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE, "Allows the user to send a title to the specified player"), [$operatorRoot]); + + $titleRoot = self::registerDeprecatedPermission(DefaultPermissionNames::COMMAND_TITLE); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE_OTHER, "Allows the user to send a title to the specified player"), [$operatorRoot, $titleRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TITLE_SELF, "Allows the user to send a title to themselves"), [$operatorRoot, $titleRoot]); + self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_TRANSFERSERVER, "Allows the user to transfer self to another server"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_UNBAN_IP, "Allows the user to unban IP addresses"), [$operatorRoot]); self::registerPermission(new Permission(DefaultPermissionNames::COMMAND_UNBAN_PLAYER, "Allows the user to unban players"), [$operatorRoot]);