Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Идея Нужен плагин на разрешение ломать определённые блоки

LeoRemington

Активный участник
Баллы
61
Нужно запретить участникам региона ломать все блоки, но разрешить ломать некоторые. Под версию 1.16.5.
block-restricter и custom flags не работают.
Я думаю, что это можно реализовать как собственный флаг, только вот я не шарю в создании плагинов, может поможет кто
 
Код:
import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroup;
import com.sk89q.worldguard.protection.flags.StringFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;

public class MyPlugin extends JavaPlugin {

    // Создаем новый флаг
    private static final Flag<String> ALLOWED_BLOCKS = new StringFlag("allowed-blocks");

    @Override
    public void onEnable() {
        // Регистрируем флаг в WorldGuard
        Flags.register(ALLOWED_BLOCKS);

        // Добавляем обработчик команды /setallowedblocks
        getCommand("setallowedblocks").setExecutor((sender, command, label, args) -> {
            if (args.length < 2) {
                sender.sendMessage(ChatColor.RED + "Использование: /setallowedblocks <region> <allowed_blocks>");
                return true;
            }

            String regionName = args[0];
            String allowedBlocks = String.join(",", args).substring(regionName.length() + 1);

            // Проверяем, что флаг ALLOWED_BLOCKS существует
            if (ALLOWED_BLOCKS == null) {
                sender.sendMessage(ChatColor.RED + "Ошибка: флаг ALLOWED_BLOCKS не зарегистрирован в WorldGuard.");
                return true;
            }

            // Получаем менеджер регионов для текущего мира
            RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(sender.getWorld()));

            // Получаем регион по имени
            ProtectedRegion region = regionManager.getRegion(regionName);

            // Проверяем, что регион существует
            if (region == null) {
                sender.sendMessage(ChatColor.RED + "Ошибка: регион не найден.");
                return true;
            }

            // Устанавливаем флаг для региона
            try {
                region.setFlag(ALLOWED_BLOCKS, allowedBlocks);
                sender.sendMessage(ChatColor.GREEN + "Установлены разрешенные блоки для региона " + regionName + ": " + allowedBlocks);
            } catch (InvalidFlagFormat e) {
                sender.sendMessage(ChatColor.RED + "Ошибка: неверный формат значения флага ALLOWED_BLOCKS.");
                return true;
            }

            return true;
        });
    }

    @Override
    public void onDisable() {
        // Снимаем регистрацию флага при выключении плагина
        Flags.unregister(ALLOWED_BLOCKS);
    }
}

Этот плагин добавляет новый флаг ALLOWED_BLOCKS для WorldGuard, который позволяет задавать список разрешенных блоков для каждого региона. Команда /setallowedblocks <region> <allowed_blocks> устанавливает значение флага для указанного региона. Как вы и говорили, я сделал плагин на версию 1.16.5.
 
Код:
import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroup;
import com.sk89q.worldguard.protection.flags.StringFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;

public class MyPlugin extends JavaPlugin {

    // Создаем новый флаг
    private static final Flag<String> ALLOWED_BLOCKS = new StringFlag("allowed-blocks");

    @Override
    public void onEnable() {
        // Регистрируем флаг в WorldGuard
        Flags.register(ALLOWED_BLOCKS);

        // Добавляем обработчик команды /setallowedblocks
        getCommand("setallowedblocks").setExecutor((sender, command, label, args) -> {
            if (args.length < 2) {
                sender.sendMessage(ChatColor.RED + "Использование: /setallowedblocks <region> <allowed_blocks>");
                return true;
            }

            String regionName = args[0];
            String allowedBlocks = String.join(",", args).substring(regionName.length() + 1);

            // Проверяем, что флаг ALLOWED_BLOCKS существует
            if (ALLOWED_BLOCKS == null) {
                sender.sendMessage(ChatColor.RED + "Ошибка: флаг ALLOWED_BLOCKS не зарегистрирован в WorldGuard.");
                return true;
            }

            // Получаем менеджер регионов для текущего мира
            RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(sender.getWorld()));

            // Получаем регион по имени
            ProtectedRegion region = regionManager.getRegion(regionName);

            // Проверяем, что регион существует
            if (region == null) {
                sender.sendMessage(ChatColor.RED + "Ошибка: регион не найден.");
                return true;
            }

            // Устанавливаем флаг для региона
            try {
                region.setFlag(ALLOWED_BLOCKS, allowedBlocks);
                sender.sendMessage(ChatColor.GREEN + "Установлены разрешенные блоки для региона " + regionName + ": " + allowedBlocks);
            } catch (InvalidFlagFormat e) {
                sender.sendMessage(ChatColor.RED + "Ошибка: неверный формат значения флага ALLOWED_BLOCKS.");
                return true;
            }

            return true;
        });
    }

    @Override
    public void onDisable() {
        // Снимаем регистрацию флага при выключении плагина
        Flags.unregister(ALLOWED_BLOCKS);
    }
}

Этот плагин добавляет новый флаг ALLOWED_BLOCKS для WorldGuard, который позволяет задавать список разрешенных блоков для каждого региона. Команда /setallowedblocks <region> <allowed_blocks> устанавливает значение флага для указанного региона. Как вы и говорили, я сделал плагин на версию 1.16.5.
работоспособность проверяли? во-первых я не вижу тут обработчика для этого флага, во-вторых какая-то странная у вас проверка на наличие регистрации у флага:

Код:
            // Проверяем, что флаг ALLOWED_BLOCKS существует
            if (ALLOWED_BLOCKS == null) {
                sender.sendMessage(ChatColor.RED + "Ошибка: флаг ALLOWED_BLOCKS не зарегистрирован в WorldGuard.");
                return true;
            }

зачем проверять константу на null?
 
действительно, ща


import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroup;
import com.sk89q.worldguard.protection.flags.StringFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;

public class MyPlugin extends JavaPlugin {

// Создаем новый флаг
private static final Flag<String> ALLOWED_BLOCKS = new StringFlag("allowed-blocks");

@Override
public void onEnable() {
// Регистрируем флаг в WorldGuard
Flags.register(ALLOWED_BLOCKS);

// Добавляем обработчик флага ALLOWED_BLOCKS
ALLOWED_BLOCKS.setRegionGroupFlag(RegionGroup.MEMBERS);

// Добавляем обработчик команды /setallowedblocks
getCommand("setallowedblocks").setExecutor((sender, command, label, args) -> {
if (args.length < 2) {
sender.sendMessage(ChatColor.RED + "Использование: /setallowedblocks <region> <allowed_blocks>");
return true;
}

String regionName = args[0];
String allowedBlocks = String.join(",", args).substring(regionName.length() + 1);

// Получаем менеджер регионов для текущего мира
RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(sender.getWorld()));

// Получаем регион по имени
ProtectedRegion region = regionManager.getRegion(regionName);

// Проверяем, что регион существует
if (region == null) {
sender.sendMessage(ChatColor.RED + "Ошибка: регион не найден.");
return true;
}

// Устанавливаем флаг для региона
try {
// Получаем значение флага ALLOWED_BLOCKS для данного региона
String previousAllowedBlocks = region.getFlag(ALLOWED_BLOCKS);

// Если значение флага не изменилось, выводим сообщение и возвращаем true
if (allowedBlocks.equals(previousAllowedBlocks)) {
sender.sendMessage(ChatColor.YELLOW + "Разрешенные блоки для региона " + regionName + " уже были установлены на " + allowedBlocks);
return true;
}

region.setFlag(ALLOWED_BLOCKS, allowedBlocks);
sender.sendMessage(ChatColor.GREEN + "Установлены разрешенные блоки для региона " + regionName + ": " + allowedBlocks);
} catch (InvalidFlagFormat e) {
sender.sendMessage(ChatColor.RED + "Ошибка: неверный формат значения флага ALLOWED_BLOCKS.");
return true;
}

return true;
});
}

@Override
public void onDisable() {
// Снимаем регистрацию флага при выключении плагина
Flags.unregister(ALLOWED_BLOCKS);
}
 
Этот код добавляет обработчик команды /setallowedblocks, который позволяет установить значение флага ALLOWED_BLOCKS для указанного региона. Если регион не существует, выводится соответствующее сообщение об ошибке.

Далее, в коде происходит попытка получить значение флага ALLOWED_BLOCKS для данного региона и сравнить его с новым значением, которое было передано в команде. Если значение флага уже равно новому значению, то выводится сообщение о том, что разрешенные блоки для региона уже были установлены на это значение.

Если значение флага отличается от нового значения, то оно устанавливается для региона и выводится сообщение об успешной установке.

Кроме того, в методе onDisable() происходит снятие регистрации флага при выключении плагина.
действительно, ща


import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroup;
import com.sk89q.worldguard.protection.flags.StringFlag;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;

public class MyPlugin extends JavaPlugin {

// Создаем новый флаг
private static final Flag<String> ALLOWED_BLOCKS = new StringFlag("allowed-blocks");

@Override
public void onEnable() {
// Регистрируем флаг в WorldGuard
Flags.register(ALLOWED_BLOCKS);

// Добавляем обработчик флага ALLOWED_BLOCKS
ALLOWED_BLOCKS.setRegionGroupFlag(RegionGroup.MEMBERS);

// Добавляем обработчик команды /setallowedblocks
getCommand("setallowedblocks").setExecutor((sender, command, label, args) -> {
if (args.length < 2) {
sender.sendMessage(ChatColor.RED + "Использование: /setallowedblocks <region> <allowed_blocks>");
return true;
}

String regionName = args[0];
String allowedBlocks = String.join(",", args).substring(regionName.length() + 1);

// Получаем менеджер регионов для текущего мира
RegionManager regionManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(sender.getWorld()));

// Получаем регион по имени
ProtectedRegion region = regionManager.getRegion(regionName);

// Проверяем, что регион существует
if (region == null) {
sender.sendMessage(ChatColor.RED + "Ошибка: регион не найден.");
return true;
}

// Устанавливаем флаг для региона
try {
// Получаем значение флага ALLOWED_BLOCKS для данного региона
String previousAllowedBlocks = region.getFlag(ALLOWED_BLOCKS);

// Если значение флага не изменилось, выводим сообщение и возвращаем true
if (allowedBlocks.equals(previousAllowedBlocks)) {
sender.sendMessage(ChatColor.YELLOW + "Разрешенные блоки для региона " + regionName + " уже были установлены на " + allowedBlocks);
return true;
}

region.setFlag(ALLOWED_BLOCKS, allowedBlocks);
sender.sendMessage(ChatColor.GREEN + "Установлены разрешенные блоки для региона " + regionName + ": " + allowedBlocks);
} catch (InvalidFlagFormat e) {
sender.sendMessage(ChatColor.RED + "Ошибка: неверный формат значения флага ALLOWED_BLOCKS.");
return true;
}

return true;
});
}

@Override
public void onDisable() {
// Снимаем регистрацию флага при выключении плагина
Flags.unregister(ALLOWED_BLOCKS);
}
 

Поделиться этой страницей

Назад
Верх