С чего начать: Команды

fromgate

Administrator

Работа с командами

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


1. Регистрация команды
Для начала нужно сообщить серверу, что у плагина есть команда. Делать это можно двумя способами — описать её в файле plugin.yml или зарегистрировать команду самостоятельно. Мы будем делать первым способом, в большинстве случаев этого достаточно.

Добавим в plugin.yml описание команды:
Code:
commands:
  news:
	aliases: ["info"]
	description: Show (and set current news)
	usage: "/news [set <Anouncement>]"
Здесь:
"news" — наша команда
"aliases" — список алиасов. Кстати, здесь параметр - это массив строк. Поэтому если алиасов несколько то описывать надо так aliases: ["alias1", "alias2"]
"description" — описание команды (будет выводиться по команде /help сервера)
"usage" — пример использования команды


2. Код исполняющий команду
Если у плагина в plugin.yml описаны команды, то сервер при написании этой команды будет передавать управление методу onCommand, основного класса плагина.
Соответственно, для реализации команды, необходимо переопределить метод onCommand.

Java:
	@Override
	public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
 
	}
[
Данный метод вызывается с параметрами:
  • sender — тот кто вызвал команду;
  • command — команда;
  • label — то как команду набирали в (тут может быть и алиас команды);
  • args — строковый массив содеражищий все введённые параметры.
Итак, нам надо реализовать команду /news таким образом, чтобы команда введённая без параметров выводила текст на экран. Но если у команды были параметры - все они рассматривались как новое значение для объявление. При этом, если команда была введена игроком, то к тексту сообщения добавлялось имя того, кто сменил объявление. Кроме того, не мешало бы проверить у игроков пермишены.

Java:
	@Override
	public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
		Player player = (sender instanceof Player) ? (Player) sender : null;
		if (args.length==0){
			if (player!=null&&!player.hasPermission("firstplugn.news.show"))
				sender.sendMessage(TextFormat.RED+"You have not enough permissions!");
			else sender.sendMessage(TextFormat.colorize("&3[NEWS] &b"+this.helloMessage));
		} else {
			if (player!=null&&!player.hasPermission("firstplugn.news.set"))
				sender.sendMessage(TextFormat.RED+"You have not enough permissions!");
			else {
				StringBuilder sb = new StringBuilder();
				for (String s : args) {
					if (sb.length() > 0) sb.append(" ");
					sb.append(s);
				}
				if (player != null) sb.append(" &3(").append(player.getName()).append(")");
				this.helloMessage = sb.toString();
				this.getConfig().set("hello-message",this.helloMessage);
				this.saveConfig();
				sender.sendMessage(TextFormat.colorize("&6You configured new announcement:"));
				sender.sendMessage(TextFormat.colorize("&3[NEWS] &b"+this.helloMessage));
			}
		}
		return true;
	}
Компилируем, запускаем, заходим в игру и...

news-result.png

3. Послесловие к командам
Вроде всё просто и понятно. По большому счёту, по другому и быть не должно. Ведь реализация команды в плагине — это по сути один метод, который нужно описать.
Но нужно остановиться ещё на одном моменте, который не был отражен в моем примере. Если Вы опишите несколько команд в plugin.yml, то при вводе любой из этих команд будет происходить вызов одного и того же метода - onCommand.
Поэтому, необходимо будет осущетсвлять проверку какая команда была введена игроком.

Выглядеть это может, например, так:

Java:
	@Override
	public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
		if (command.getLabel().equalsIgnoreCase("command1")){
			// выполяемая команду command1
	  
	  
		} else if (command.getLabel().equalsIgnoreCase("command2")){
			// выполяемая команду command2
	  
	  
		} else return false;
		return true;
	}
Напоследок, хочу отметить, что "исполнители команда" можно зарегистрировать отдельно, не привязываясь к файлу plugin.yml и основному классу плагина. На мой взгляд, это очень удобно в случае плагинов, которые реализуют большое количество команд.
 
Last edited:

fromgate

Administrator
Даже не знаю. Вроде все основы изложил: бери и делай плагин ;)

О чём ещё нужно рассказать, как считаете?
 

impact

Error #404, User not found
In Resignation
Приветствую, у тебя во 2 пункте ошибка с форматирования текста, у тебя
Code:
[code]
берет и ему подобные и делает код кривым.
Будь добр, исправь это ;)
 

fromgate

Administrator
Приветствую, у тебя во 2 пункте ошибка с форматирования текста, у тебя
Code:
[code]
берет и ему подобные и делает код кривым.
Будь добр, исправь это ;)
Спасибо, подправил.
 
хороший урок! я так понял, структура плагина нуккит, мало чем отличается от буккит.
 

fromgate

Administrator
Логика такая же. Поскольку Nukkit - это порт PocketMine, то явно видно, что PocketMine писался под впечатлением от Bukkit ;)
 

Tee7even

Nukkit Coders Team
Кроме того, не мешало бы проверить у игроков пермишены.
У меня такой скромный вопрос - в PM я права описывал в plugin.yml, тут такое не нужно вообще или об этом не говорится ввиду необязательности?

Поэтому, необходимо будет осущетсвлять проверку какая команда была введена игроком.

Выглядеть это может, например, так:
Ну и тут switch нельзя использовать?
 

fromgate

Administrator
У меня такой скромный вопрос - в PM я права описывал в plugin.yml, тут такое не нужно вообще или об этом не говорится ввиду необязательности?
Можно описывать, я уже "испытал": https://github.com/NukkitRu/Welcome/blob/master/src/main/resources/plugin.yml
Не описал эту возможность в первую очередь из-за того что сам не использовал. В бакките, при обилии хороших менеджеров пермишенов, я всегда считал, что владелец сервера должен сам принять решение по каждому конкретному пермишену.


Ну и тут switch нельзя использовать?
Можно, это вопрпос техники.
При использовании двух-трёх вариантов выбора, я вряд ли буду использовать switch. Но если их много, тогда -- это удобнее всего.
 

Tee7even

Nukkit Coders Team
Можно описывать, я уже "испытал": https://github.com/NukkitRu/Welcome/blob/master/src/main/resources/plugin.yml
Не описал эту возможность в первую очередь из-за того что сам не использовал. В бакките, при обилии хороших менеджеров пермишенов, я всегда считал, что владелец сервера должен сам принять решение по каждому конкретному пермишену.
Я, конечно, того же мнения, но тут соль в том, что тут у прав может быть поле children, которым можно описать права, которые будут добавляться автоматически, если будет добавлено исходное право. Насколько я знаю, без этого firstplugin.news.set и firstplugin.news.show не будут добавлены, если добавлен firstplugin.news. :)

Можно, это вопрпос техники.
При использовании двух-трёх вариантов выбора, я вряд ли буду использовать switch. Но если их много, тогда -- это удобнее всего.
Я просто немного сомневался, т.к. строки в Java нельзя сравнивать оператором ==, то я подумал, что и switch тут не будет к месту.
 

fromgate

Administrator
Дочерние пермишены сейчас криво работают. Так что лучше пока без них.

До Java 7 нельзя было switch использовать для строк. Я поэтому к такому не привык :)
 

Tee7even

Nukkit Coders Team
Дочерние пермишены сейчас криво работают. Так что лучше пока без них.
Блен, ничего нормально не работает... Интересно, когда уже PE выйдет из альфы и разработчики перестанут так резко менять клиент и всё будет более-менее логично? ¯\_(ツ)_/¯
 

kirill3345

Пользователь
А как зарегистрировать команду, если она в другом классе?
В Bukkit так:
Code:
this.getCommand("helloworld").setExecutor(new Commands());
 
Last edited:

Pub4Game

Модератор всея Nukkit.ru
Moderator
А как зарегистрировать команду, если она в другом классе?
В Bukkit так:
Code:
this.getCommand("helloworld").setExecutor(new Commands());
В Nukkit тоже так должно быть, но....

Надо исправлять :)
 

Pub4Game

Модератор всея Nukkit.ru
Moderator
Говорю же)) Надо исправлять, это есть в ядре, но работает некорректно.
 
Top