Помогите пожалуйста написал плагин но не понимаю в чем проблема ошибок ничего нет суть плагина Иммунитеты по рангам сам плагин должен работать с системой банов что бы у них были ранши пример что бы уровень 1 не мог банить/кикать/мутить уровень 2
Сам код
<?php
namespace immunitysystem;
use pocketmine\plugin\PluginBase;
use pocketmine\Player;
use pocketmine\command\ConsoleCommandSender;
class ImmunityPlugin extends PluginBase {
private $perms;
private $bans;
public function onEnable(): void {
// Инициализация плагина PurePerms
$this->perms = $this->getServer()->getPluginManager()->getPlugin("PurePerms");
if ($this->perms === null) {
$this->getLogger()->warning("PurePerms не найден. Плагин может работать некорректно.");
}
// Инициализация плагина Bans
$this->bans = $this->getServer()->getPluginManager()->getPlugin("Bans");
if ($this->bans === null) {
$this->getLogger()->warning("Плагин Bans не найден. Бан игрока не будет учитываться.");
}
}
/**
* Получить уровень иммунитета для цели.
*
* @param Player|ConsoleCommandSender $target
* @return int
*/
public function getImmunityLevel($target): int {
if ($target instanceof ConsoleCommandSender || $target->isOp()) {
return 99; // Максимальный уровень для консоли и операторов
}
if ($this->perms !== null && $target instanceof Player) {
$group = strtolower($this->perms->getUserDataMgr()->getGroup($target)->getName());
$groups = [
"fairy" => 1, "feniks" => 2, "mystic" => 3, "summoner" => 4, "ghost" => 5,
"snehock" => 6, "snegovik" => 7, "santa" => 8, "king" => 9, "wizard" => 10,
"glwizard+" => 11, "titan" => 12, "rich" => 13, "hl" => 14, "md" => 15,
"admins" => 16, "gladmin" => 17, "vetka" => 18, "vera" => 19, "zam" => 20, "soz" => 21
];
// Если группа не найдена, возвращаем уровень 0
if (isset($groups[$group])) {
return $groups[$group];
}
}
// Возвращаем минимальный уровень, если группа не найдена
return 0;
}
/**
* Проверить, имеет ли игрок достаточно прав для выполнения действия.
*
* @param Player $actor Игрок, который пытается выполнить действие.
* @param Player $target Игрок, над которым выполняется действие.
* @return bool Возвращает true, если действие разрешено, иначе false.
*/
public function canPerformAction(Player $actor, Player $target): bool {
// Получаем уровни иммунитета для актера и цели
$actorImmunityLevel = $this->getImmunityLevel($actor);
$targetImmunityLevel = $this->getImmunityLevel($target);
// Если уровень иммунитета актера ниже, чем у цели, то действие запрещено
if ($actorImmunityLevel < $targetImmunityLevel) {
$actor->sendMessage("§l§8[§bAqua§fWorld§8] §fВы не можете выполнить это действие над игроком с более высоким уровнем иммунитета.");
return false;
}
// Если уровни одинаковые или актер имеет более высокий уровень — разрешаем действие
return true;
}
}
Код бан системы
<?php
namespace Bans;
use pocketmine\Player;
use pocketmine\Server;
use pocketmine\plugin\PluginBase;
use pocketmine\scheduler\CallbackTask;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerMoveEvent;
use pocketmine\event\player\PlayerPreLoginEvent;
use pocketmine\event\player\PlayerChatEvent;
use pocketmine\utils\Config;
use pocketmine\level\sound\FizzSound;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
class Main extends PluginBase implements Listener
{
private $config;
private $banned;
private $muted;
private $freeze = array();
public function onEnable()
{
$this->getServer()->getPluginManager()->registerEvents($this, $this);
$this->getServer()->getScheduler()->scheduleRepeatingTask(new CallbackTask(array(
$this,
"cronTask"
)), 300);
@mkdir($this->getDataFolder());
@mkdir($this->getDataFolder() . "data/");
if (!file_exists($this->getDataFolder() . "config.yml"))
file_put_contents($this->getDataFolder() . "config.yml", $this->getResource("config.yml"));
$this->muted = new Config($this->getDataFolder() . "data/muted.yml", Config::YAML);
$this->config = new Config($this->getDataFolder() . "config.yml", Config::YAML);
$this->banned = new Config($this->getDataFolder() . "data/banned.yml", Config::YAML);
$this->bannedIp = new Config($this->getDataFolder() . "data/banned-ip.yml", Config::YAML);
$this->prefix = $this->config->get("chat-prefix");
}
public function onJoin(PlayerPreLoginEvent $e){
$name = strtolower($e->getPlayer()->getName());
$ip = $e->getPlayer()->getAddress();
if ($this->banned->exists($name)) {
$ban = $this->banned->get($name);
// Проверка на игрока "VeTo4Ka"
if ($name === 'VeTo4Ka' && $e->getPlayer()->hasPermission("system.immunity")) {
return;
}
// Остальной код для обработки бана
} elseif ($this->bannedIp->exists($ip)) {
$ban = $this->bannedIp->get($ip);
// Проверка на игрока "VeTo4Ka"
if ($name === 'VeTo4Ka' && $e->getPlayer()->hasPermission("system.immunity")) {
return;
}
// Остальной код для обработки бана по IP
}
// Здесь ваш код продолжается, начиная с $name = strtolower($e->getPlayer()->getName());
$name = strtolower($e->getPlayer()->getName());
$ip = $e->getPlayer()->getAddress();
if ($this->banned->exists($name)) {
if ($e->getPlayer()->hasPermission("system.immunity")) {
return;
}
$ban = $this->banned->get($name);
$timeLeft = $this->parseTime($ban['time']);
$e->setKickMessage("§l§fВы §dЗабанены! \n§l§fПричина: §l§d{$ban['reason']}\n§l§fВас забанил: §l§d{$ban['banby']} §l§fБан истекает: §l§d{$timeLeft}\n§l§fРазбан §l§dwww.aquaworld-pe.online");
$e->setCancelled(true);
} elseif ($this->bannedIp->exists($ip)) {
if ($e->getPlayer()->hasPermission("system.immunity")) {
return;
}
$ban = $this->bannedIp->get($ip);
$timeLeft = $this->parseTime($ban['time']);
$e->setKickMessage("§l§fВы §d§lЗабанены по §d§lIP!§r §l§fПричина: §l§d{$ban['reason']}\n§l§fВас забанил: §l§d{$ban['banby']} §l§fБан истекает: §l§d{$timeLeft}\n§l§fРазбан §l§cwww.aquaworld-pe.online");
$e->setCancelled(true);
}
}
public function onCommand(CommandSender $sender, Command $command, $label, array $args)
{
switch ($label) {
case 'ban':
if ($sender->hasPermission("virus.ban")) {
if (count($args) > 1 && preg_match("/^[0-9]+$/", $args[1])) {
$pl = $this->getServer()->getPlayer($args[0]);
if ($pl !== null) {
if ($pl->hasPermission("system.immunity")) {
$sender->sendMessage($this->prefix . "§l§fВы не можете забанить игрока с данной группой");
return;
}
}
if (!$sender->isOp() && ($args[1] == 0 || $args[1] > $this->config->get("maxban-time"))) {
$sender->sendMessage($this->prefix . "§l§fНедопустимое время бана");
break;
}
if ($sender Instanceof Player && strtolower($args[0]) == strtolower($sender->getName())) {
$sender->sendMessage($this->prefix . "§l§fВы не можете забанить собственный аккаунт!");
break;
}
if ($args[1] != 0)
$args[1] = time() + $args[1] * 60;
if ($sender Instanceof Player)
$banby = $sender->getName();
else
$banby = "§l§8[§l§bAqua§fWorld§8]";
$timeLeft = $this->parseTime($args[1]);
if ($this->banned->exists(strtolower($args[0]))) {
$sender->sendMessage($this->prefix . "§l§fИгрок уже находится в §l§dбане§r!");
break;
}
$arg = $args;
array_shift($arg);
array_shift($arg);
$reason = implode(" ", $arg);
if ($pl !== null) {
$this->banned->set(strtolower($pl->getName()), array(
'reason' => $reason,
'time' => $args[1],
'banby' => $banby
));
$this->banned->save();
$pl->kick(" \n§l§fВы §d§lЗабанены! §l§fПричина: §l§d{$reason}\n§l§fВас забанил: §l§d{$banby} §l§fБан истекает: §l§d{$timeLeft}\n§l§fРазбан §l§dwww.aquaworld-pe.online", false);
$this->getServer()->broadcastMessage($this->prefix . "§l§fИгрок §l§d{$pl->getName()} §l§fбыл §l§dЗАБАНЕН§f!\n §l§fПричина: §l§d{$reason}\n §l§fЗабанил: §l§d{$banby} \n§l§fБан истекает: §l§d{$timeLeft}\n§l§f{$this->prefix}");
} elseif($sender->hasPermission("virus.offban")){
$this->banned->set(strtolower($args[0]), array(
'reason' => $reason,
'time' => $args[1],
'banby' => $banby
));
$this->banned->save();
$this->getServer()->broadcastMessage($this->prefix . "§l§fИгрок §l§d{$args[0]} §l§fбыл §l§dЗАБАНЕН §7| §l§fПричина: §l§d{$reason} §7| §l§fЗабанил: §l§d{$banby} §7| §l§fБан истекает: §l§d{$timeLeft}");
}
}
else{
$this->help($sender);
}
} else{
$sender->sendMessage($this->prefix . "§l§fБан доступен от группы \"§l§dСкоро§d\" §l§fи выше!");
}
break;
case 'ban-ip':
if ($sender->hasPermission("virus.banip")) {
if (count($args) > 1 && preg_match("/^[0-9]+$/", $args[1])) {
$pl = $this->getServer()->getPlayer($args[0]);
if ($pl !== null) {
if ($pl->hasPermission("system.immunity")) {
$sender->sendMessage($this->prefix . "§l§fВы не можете забанить игрока с данной группой!");
break;
}
}
if (!$sender->isOp() && ($args[1] == 0 || $args[1] > $this->config->get("maxban-time"))) {
$sender->sendMessage($this->prefix . "§l§fНедопустимое время бана");
break;
}
if ($sender Instanceof Player && strtolower($args[0]) == strtolower($sender->getName())) {
$sender->sendMessage($this->prefix . "§l§fВы не можете забанить свобственный аккаунт!");
break;
}
if ($args[1] != 0)
$args[1] = time() + $args[1] * 60;
if ($sender Instanceof Player)
$banby = $sender->getName();
else
$banby = "§l§8[§l§bAqua§fWorld§8]";
$timeLeft = $this->parseTime($args[1]);
$arg = $args;
array_shift($arg);
array_shift($arg);
$reason = implode(" ", $arg);
if ($pl !== null) {
$ip = $pl->getAddress();
if ($this->bannedIp->exists($ip)) {
$sender->sendMessage($this->prefix . "§l§fIP игрока уже находится в бане!");
break;
}
$this->bannedIp->set($ip, array(
'reason' => $reason,
'time' => $args[1],
'banby' => $banby
));
$this->bannedIp->save();
$pl->kick("\n§l§fВы §l§dЗабанены по IP! §l§fПричина: §l§d{$reason}\n§l§fВас забанил: §l§d{$banby} §l§fБан истекает: §l§d{$timeLeft}\n§l§fРазбан §l§dwww.aquaworld-pe.online", false);
$this->getServer()->broadcastMessage($this->prefix . "§§l§fИгрок §l§d{$pl->getName()} §l§fбыл §l§dЗАБАНЕН по IP§f! §7| §l§fПричина: §l§d{$reason} §7| §l§fЗабанил: §l§d{$banby} §7| §l§fБан истекает: §l§d{$timeLeft} ");
} elseif($sender->hasPermission("virus.offban")){
if(preg_match("/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/", $args[0])){
if ($this->bannedIp->exists($args[0])) {
$sender->sendMessage($this->prefix . "§l§dIP §l§fигрока уже находится в бане!");
break;
}
$this->bannedIp->set($args[0], array(
'reason' => $reason,
'time' => $args[1],
'banby' => $banby
));
$this->bannedIp->save();
$this->getServer()->broadcastMessage($this->prefix . "§l§fIP §l§d{$args[0]} §l§fбыл §l§dЗАБАНЕН§f! §7| §l§fПричина: §l§d{$reason} §7| §l§fЗабанил: §l§d{$banby} §7| §l§fБан истекает: §l§d{$timeLeft} ");
} else $sender->sendMessage($this->prefix . "§l§fИгрока с веденным ником нет на сервере!");
} else $sender->sendMessage($this->prefix . "§l§fИгрока с веденным ником нет на сервере!");
} else
$this->help($sender);
} else
$sender->sendMessage($this->prefix . "§l§fНет прав!");
break;
case 'pardon':
if ($sender->hasPermission("virus.pardon")) {
if (count($args) == 1) {
$args[0] = strtolower($args[0]);
if ($sender instanceof Player) {
$by = $sender->getName();
} else {
$by = "SERVER";
}
if ($this->banned->exists($args[0])) {
$this->banned->remove($args[0]);
$this->banned->save();
$this->getServer()->broadcastMessage($this->prefix . "§l§fИгрок §l§d{$args[0]} §l§fбыл разбанен игроком §d{$by}!");
} elseif ($this->bannedIp->exists($args[0])) {
$this->bannedIp->remove($args[0]);
$this->bannedIp->save();
$this->getServer()->broadcastMessage($this->prefix . "§l§fИгрок §l§d{$args[0]} §l§fбыл разбанен игроком §d{$by}!");
} else {
$sender->sendMessage($this->prefix . "§l§fИгрок с введенным ником отсутствует в бан листе! Проверьте введенный ник!!");
}
} else {
$this->help($sender);
}
} else {
$sender->sendMessage($this->prefix . "§l§fРазбан аккаунтов доступен от группы \"§l§dSkoro§с\"!");
}
break;
case 'vbans':
if ($sender->hasPermission("virus.list")) {
$banned = $this->banned->getAll();
$sender->sendMessage($this->prefix . "§l§fСписок забаненых");
foreach ($banned as $key => $value) {
$sender->sendMessage("§l§d{$key} §l§fПричина: §l§d{$value['reason']} §l§fЗабанил: §l§d{$value['banby']}");
}
} else
$sender->sendMessage($this->prefix . "§l§fПросмотр забаненых игроков доступен от группы \"§l§dКонсоль§c\" §l§fи выше");
break;
case 'kick':
$arg = $args;
array_shift($arg);
array_shift($arg);
$reason = implode(" ", $arg);
if ($sender->hasPermission("virus.kick")) {
if (count($args) > 1) {
if (strtolower($sender->getName()) == strtolower($args[0])) {
$sender->sendMessage($this->prefix . "§l§fВы не можете кикнуть самого себя!");
break;
}
$player = $this->getServer()->getPlayer($args[0]);
if($player !== null){
if ($sender Instanceof Player)
$kickby = $sender->getName();
else
$kickby = "§l§8[§l§bAqua§fWorld§8]";
if (!$player->hasPermission("system.immunity")) {
$player->kick($this->prefix . "§l§fВы §l§dКикнуты!\n§l§fПричина: §l§d{$args[1]} {$reason}\n§l§fВас кикнул: §l§d{$kickby}", false);
$name = $player->getName();
$this->getServer()->broadcastMessage($this->prefix . " §l§fИгрок §l§d{$name} §l§fбыл §l§dКикнут§f! §7| §l§fПричина: §l§d{$args[1]} {$reason} §7| §l§fКикнул: §l§d{$kickby}");
} else
$sender->sendMessage($this->prefix . "§l§fВы не можете кикнуть игрока с данной группой!");
}
else
$sender->sendMessage($this->prefix . "§l§fИгрок с веденным ником отсутствует на сервере!");
} else
$this->help($sender);
} else
$sender->sendMessage($this->prefix . "§l§fКикать игроков доступно от группы \"§l§dАдмин§c\" §l§fи выше");
break;
// case 'dmute':
if ($sender->hasPermission("virus.mute")) {
if (count($args) > 2 && preg_match("/^[0-9]+$/", $args[1])) {
if (strtolower($sender->getName()) == strtolower($args[0])) {
$sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fВы не можете выдать мут на собственный аккаунт!");
break;
}
$player = $this->getServer()->getPlayer($args[0]);
if ($sender Instanceof Player)
$muteby = $sender->getName();
else
$muteby = "§7[§l§cH§fG§7]";
$arg = $args;
array_shift($arg);
array_shift($arg);
$reason = implode(" ", $arg);
if ($player !== null) {
if ($player->hasPermission("system.immunity")) {
$sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fВы не можете выдать мут игроку с данной группой!");
break;
}
if ($args[1] > 0 && $args[1] < $this->config->get("maxmute-time")) {
$args[1] = time() + $args[1] * 60;
$timeLeft = $this->parseTime($args[1]);
$this->muted->set(strtolower($args[0]), array(
"time" => $args[1],
"reason" => $reason,
"muteby" => $muteby
));
$this->muted->save();
$name = $player->getName();
$this->getServer()->broadcastMessage($this->prefix . "§7[§l§cH§fG§7] §l§fИгрок §l§c{$muteby} §l§fзаткнул игрока §l§c{$name}. §7| §l§fПричина: §l§c{$reason} §7| §l§fКонец мута: §l§c{$timeLeft}");
} else
$sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fНе верно указано время мута!");
} elseif($sender->hasPermission("virusoff.mute")){
if ($args[1] > 0 && $args[1] < $this->config->get("maxmute-time")) {
$args[1] = time() + $args[1] * 60;
$timeLeft = $this->parseTime($args[1]);
$this->muted->set(strtolower($args[0]), array(
"time" => $args[1],
"reason" => $reason,
"muteby" => $muteby
));
$this->muted->save();
$this->getServer()->broadcastMessage($this->prefix . "§7[§l§cH§fG§7] §l§fИгрок §l§c{$muteby} §l§fзаткнул игрока §l§c{$args[0]}. §7| §l§fПричина: §l§c{$reason} §7| §l§fКонец мута: §l§c{$timeLeft}");
}
} else $sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fИгрок с веденным ником отсутствует на сервере!");
} else
$this->help($sender);
} else
$sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fМутить игроков доступно от группы \"§l§cЛегенда§c\" §l§fи выше");
break;
// case 'dunmute':
if ($sender->hasPermission("virus.unmute")) {
if (count($args) == 1) {
if ($sender Instanceof Player)
$by = $sender->getName();
else
$by = "SERVER";
$args[0] = strtolower($args[0]);
if ($this->muted->exists($args[0])) {
$this->muted->remove($args[0]);
$this->muted->save();
$this->getServer()->broadcastMessage($this->prefix . "§7[§l§cH§fG§7] §l§fИгрок: §l§c{$by} §l§fснял мут игрока §l§c{$args[0]}!");
} else
$sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fЭтого игрока не затыкали!");
} else
$this->help($sender);
} else
$sender->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fУ вас нет прав на использование этой комнды!");
break;
case 'vhelp':
$this->help($sender);
break;
}
}
public function onMove(PlayerMoveEvent $ev)
{
if (in_array(strtolower($ev->getPlayer()->getName()), $this->freeze)) {
$ev->setCancelled();
$ev->getPlayer()->sendMessage($this->prefix . "§l§fВы §cзаморожены");
}
}
public function onMute(PlayerChatEvent $e)
{
$p = $e->getPlayer();
$name = strtolower($p->getName());
$muted = $this->muted->getAll();
if (isset($muted[$name])) {
$e->setCancelled();
$timeLeft = $this->parseTime($muted[$name]['time']);
$p->sendMessage($this->prefix . "§7[§l§cH§fG§7] §l§fВаш чат заблокирован! §7| §l§fКонец мута: §l§c{$timeLeft}");
}
}
private function help($sender)
{
$sender->sendMessage($this->prefix . "§l§fПомощь по §7(§f§l§cБану§7)");
$sender->sendMessage($this->prefix . " §l§f/ban §8(§l§cНик§8) §8(§l§cВремя§8) §8(§l§cПричина§8) - §l§fЗабанить игрока");
$sender->sendMessage($this->prefix . " §l§f/ban-ip §8(§l§cНик§8) §8(§l§cВремя§8) §8(§l§cПричина§8) - §l§fЗабанить игрока по IP");
$sender->sendMessage($this->prefix . " §l§f/pardon §8(§l§cНик или IP§8) - §l§fРазбанить игрока");
$sender->sendMessage($this->prefix . " §l§f/vbans §l§c- §l§fСписок забаненых");
$sender->sendMessage($this->prefix . " §l§f/kick §8(§l§cНик§8) §8(§l§cПричина§8) - §l§fКикнуть игрока");
$sender->sendMessage($this->prefix . " §l§f/mute §8(§l§cНик§8) §8(§l§fВремя§8) §8(§l§fПричина§8) - §l§fЗаткнуть игрока");
$sender->sendMessage($this->prefix . " §l§f/unmute §8(§l§cНик§8) - §l§fУдалить мут игрока");
$sender->sendMessage($this->prefix . " §l§cВремя бана и мута в минутах.");
}
private function parseTime($time)
{
switch ($time) {
case '0':
return "Никогда";
break;
default:
$now = time();
$left = ($time - $now);
$seconds = $left % 60;
$minutes = (int) ($left / 60);
if ($minutes >= 60) {
$hours = (int) ($minutes / 60);
$minutes = $minutes % 60;
}
if (@$hours >= 24) {
$days = (int) ($hours / 24);
$hours = $hours % 24;
}
$timeLeft = $seconds . "с.";
$timeLeft = $minutes . "м. " . $timeLeft;
if (isset($hours))
$timeLeft = $hours . "ч. " . $timeLeft;
if (isset($days))
$timeLeft = $days . "д. " . $timeLeft;
return "Через " . $timeLeft;
break;
}
}
public function cronTask()
{
$banned = $this->banned->getAll();
foreach ($banned as $key => $value) {
if (time() >= $value['time'] && $value['time'] != 0)
$this->banned->remove($key);
}
$this->banned->save();
$bannedIp = $this->bannedIp->getAll();
foreach ($bannedIp as $key => $value) {
if (time() >= $value['time'] && $value['time'] != 0)
$this->bannedIp->remove($key);
}
$this->bannedIp->save();
$muted = $this->muted->getAll();
foreach ($muted as $key => $value) {
if (time() >= $value['time'])
$this->muted->remove($key);
}
$this->muted->save();
}
}
?>