Разработка плагина на приват в рудами [ PM5 ]

Я пытаюсь сделать плагин для PM5 на приват блоками с помощью Chat GPT 4

Вот код:

<?php
namespace PrivateBlocks;

use pocketmine\plugin\PluginBase;
use pocketmine\event\Listener;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\block\BlockPlaceEvent;
use pocketmine\utils\Config;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\player\Player;

class Main extends PluginBase implements Listener {

    /** @var Config */
    private $areas;

    public function onEnable(): void {
        @mkdir($this->getDataFolder());
        $this->areas = new Config($this->getDataFolder() . "areas.yml", Config::YAML);
        $this->getServer()->getPluginManager()->registerEvents($this, $this);
    }

    public function onBlockBreak(BlockBreakEvent $event): void {
        $block = $event->getBlock();
        $player = $event->getPlayer();
        if ($this->isAreaProtected($block->getX(), $block->getY(), $block->getZ(), $player->getName())) {
            $event->setCancelled();
            $player->sendMessage("Эта зона защищена.");
        }
    }

    public function onBlockPlace(BlockPlaceEvent $event): void {
        $block = $event->getBlock();
        $player = $event->getPlayer();
        if ($this->isAreaProtected($block->getX(), $block->getY(), $block->getZ(), $player->getName())) {
            $event->setCancelled();
            $player->sendMessage("Эта зона защищена.");
        }
    }

    private function isAreaProtected(int $x, int $y, int $z, string $playerName): bool {
        foreach ($this->areas->getAll() as $area) {
            if ($x >= $area["x1"] && $x <= $area["x2"] && $y >= $area["y1"] && $y <= $area["y2"] && $z >= $area["z1"] && $z <= $area["z2"]) {
                if (!in_array($playerName, $area["whitelist"], true)) {
                    return true;
                }
            }
        }
        return false;
    }

public function onBlockPlace(BlockPlaceEvent $event): void {
    $block = $event->getBlock();
    $player = $event->getPlayer();
    // Проверяем, не находится ли блок уже в защищённой зоне
    if (!$this->isAreaProtected($block->getX(), $block->getY(), $block->getZ(), $player->getName())) {
        // Создаём новую защищённую зону
        $this->createProtectedArea($block, $player);
        $player->sendMessage("Защищённая зона создана вокруг блока.");
    }
}

private function createProtectedArea(Block $block, Player $player): void {
    $oreSize = $this->getOreSize($block->getId());
    $x1 = $block->getX() - $oreSize;
    $x2 = $block->getX() + $oreSize;
    $y1 = $block->getY() - $oreSize;
    $y2 = $block->getY() + $oreSize;
    $z1 = $block->getZ() - $oreSize;
    $z2 = $block->getZ() + $oreSize;

    $area = [
        "x1" => $x1,
        "x2" => $x2,
        "y1" => $y1,
        "y2" => $y2,
        "z1" => $z1,
        "z2" => $z2,
        "whitelist" => [$player->getName()]
    ];

    // Сохраняем новую зону в конфиг
    $this->areas->set($player->getName() . "_" . time(), $area);
    $this->areas->save();
}

private function getOreSize(int $blockId): int {
    // Здесь вы можете определить размер зоны для каждого типа руды
    // Например, для угля размер зоны будет 5, для железа - 10 и т.д.
    $oreSizes = [
        Block::COAL_ORE => 5,
        Block::IRON_ORE => 10,
        // Добавьте другие руды и их размеры здесь...
    ];

    return $oreSizes[$blockId] ?? 0; // Если руда не найдена, возвращаем 0
}

public function onBlockBreak(BlockBreakEvent $event): void {
    $block = $event->getBlock();
    $player = $event->getPlayer();
    // Проверяем, принадлежит ли блок защищённой зоне
    $areaKey = $this->getAreaKeyByBlock($block);
    if ($areaKey !== null && $this->isPlayerOwnerOfArea($player->getName(), $areaKey)) {
        // Удаляем защищённую зону
        $this->areas->remove($areaKey);
        $this->areas->save();
        $player->sendMessage("Защищённая зона удалена.");
    } 

    if ($player->hasPermission("region.bypass")) {
    // Игрок может ломать блоки в любом регионе
    return;
    }
    else {
        // Если блок находится в чужой защищённой зоне, отменяем событие
        if ($this->isAreaProtected($block->getX(), $block->getY(), $block->getZ(), $player->getName())) {
            $event->setCancelled();
            $player->sendMessage("Эта зона защищена.");
        }
    }
}

private function getAreaKeyByBlock(Block $block): ?string {
    foreach ($this->areas->getAll() as $key => $area) {
        if ($block->getX() >= $area["x1"] && $block->getX() <= $area["x2"] &&
            $block->getY() >= $area["y1"] && $block->getY() <= $area["y2"] &&
            $block->getZ() >= $area["z1"] && $block->getZ() <= $area["z2"]) {
            return $key;
        }
    }
    return null;
}

private function isPlayerOwnerOfArea(string $playerName, string $areaKey): bool {
    $area = $this->areas->get($areaKey);
    return isset($area) && in_array($playerName, $area["whitelist"], true);
}

// ... (в классе Main)

public function onCommand(CommandSender $sender, Command $command, string $label, array $args): bool {
    if ($command->getName() === "region") {
        if (!$sender instanceof Player) {
            $sender->sendMessage("Эту команду можно использовать только в игре.");
            return true;
        }

        if (count($args) < 2) {
            $sender->sendMessage("Использование: /region <add|remove> <игрок>");
            return true;
        }

        $action = strtolower(array_shift($args));
        $targetName = array_shift($args);
        $player = $this->getServer()->getPlayerExact($targetName);

        if ($action === "add") {
            $this->addPlayerToRegion($sender->getName(), $player);
            $sender->sendMessage("Игрок {$player->getName()} добавлен в ваш регион.");
        } elseif ($action === "remove") {
            $this->removePlayerFromRegion($sender->getName(), $player);
            $sender->sendMessage("Игрок {$player->getName()} удален из вашего региона.");
        } else {
            $sender->sendMessage("Неизвестное действие. Используйте add или remove.");
        }
        return true;
    }

    return false;
}

private function addPlayerToRegion(string $ownerName, Player $player): void {
    // Добавляем игрока в whitelist региона
    $areaKey = $this->getAreaKeyByOwner($ownerName);
    if ($areaKey !== null) {
        $area = $this->areas->get($areaKey);
        $area["whitelist"][] = $player->getName();
        $this->areas->set($areaKey, $area);
        $this->areas->save();
    }
}

private function removePlayerFromRegion(string $ownerName, Player $player): void {
    // Удаляем игрока из whitelist региона
    $areaKey = $this->getAreaKeyByOwner($ownerName);
    if ($areaKey !== null) {
        $area = $this->areas->get($areaKey);
        if (($key = array_search($player->getName(), $area["whitelist"], true)) !== false) {
            unset($area["whitelist"][$key]);
            $this->areas->set($areaKey, $area);
            $this->areas->save();
        }
    }
}

private function getAreaKeyByOwner(string $ownerName): ?string {
    foreach ($this->areas->getAll() as $key => $area) {
        if (in_array($ownerName, $area["whitelist"], true)) {
            return $key;
        }
    }
    return null;
}



}

Вот Plugin.yml

name: RegionManager
version: 1.0
api: [5.0.0]
main: PrivateBlocks\Main
author: Ваше_Имя
description: Плагин для управления приватными регионами в Minecraft.

commands:
  region:
    description: Управление регионами
    usage: "/region <add|remove> <игрок>"
    permission: region.manage

permissions:
  region.manage:
    description: Позволяет управлять регионами
    default: op
  region.bypass:
    description: Позволяет ломать блоки в любом регионе
    default: op

Кто знает как поправить код что лучше сделать напишите плиз.

Чего ты от нас ожидаешь?

Этого: напишите за меня пжпжпжп

Да тут все переписывать нужно

что за пиздец .

Как минимум не писать все в 1 классе

Бляя щас такую сборку с ChatGPT сделаю

Я клянусь бобом умения этого ооп дрочера заканчиваются на создании команды/слушателя в отдельном классе

Ну, вопрос был поставлен как улучшить код, а сможет ли это сделать или нет, я уже не знаю

хахахахаха

Эта тема была автоматически закрыта через 12 часов после последнего ответа. В ней больше нельзя отвечать.