Я пытаюсь сделать плагин для 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
Кто знает как поправить код что лучше сделать напишите плиз.