Помогите Детект одноименной команды другого плагина

  • Автор темы Автор темы iD3LSY
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

iD3LSY

Активный участник
Пользователь
Баллы
76
Привет все <3

Нужно ловить команды из другого плагина, заменяя на свою. Конечно можно просто удалить команду из plugin.yml другого плагина, но если она регистрирована рефлексией/просто лень, то ничего не поделать.

Как можно реализовать сея каприз?



А за прочитанное, я вам расскажу о неком бизнес плане.

Заключается в следующем:
  • Пишете плагин на кейсы.
  • Заходите в раздел "Запросы на разработку плагинов".
  • Ищите очередного раба системы/индивидуума, который не в силах скачать его сам (тут как повезет).
  • Продаете всем один и тот же плагин. Пруфит!
 
PlayerCommandPreprocessEvent
 
PlayerCommandPreprocessEvent
Эм... Ну ладно, я думал на счет этого.

Вопрос то тогда в следующем.
Видишь ли кириллицу мне подавай. У меня команды у самого рефликсией реганы. Если я буду отменять, то как команду свою выполнить?

Может конечно и старенький дядя костыль выручит, тип регать команду с другим названием, а при выполнение той, которая уже занята отменять её, выполнять свою.
 
Эм... Ну ладно, я думал на счет этого.

Вопрос то тогда в следующем.
Видишь ли кириллицу мне подавай. У меня команды у самого рефликсией реганы. Если я буду отменять, то как команду свою выполнить?

Может конечно и старенький дядя костыль выручит, тип регать команду с другим названием, а при выполнение той, которая уже занята отменять её, выполнять свою.
/pluginname:command
 
Видимо вопрос реально в какой то степени проблемный xD


О чем ты? Это просто выполнение команды, которое поможет в реализации костыля. Есть ли все же с твоей точки зрения корректный ответ на заданный изначально вопрос?

Конечно, можно это и так использовать в игровой консоле, если пишешь плагин исключительно для себя (я так и делаю, но все же). Другие люди вряд ли будут париться на такую тему с вводом названия плагина ("pluginname:").
 
Или через Command Map убирай, а только потом добавляй свою
 
Если регать свою команду после того как такую же зарегал кто-то еще, то будет же твоя работать, не?
 
Или через Command Map убирай, а только потом добавляй свою
В том и вопрос, как её убрать?)
Если регать свою команду после того как такую же зарегал кто-то еще, то будет же твоя работать, не?
Честно - я хз. Я пытаюсь перекрыть команду из Essentials. Мою шлет куда подальше. Может быть, берется 2 плагина, в которых есть одинаковая команда, а потом просто сравнивает их по алфавиту (название плагинов), и выполняет то, что ближе к 'A'.
 
Я всё же думаю, что разница во времени регистрации имеет значение. Протестируй это.
А вообще в Essentials можно отключать команды. Но это, конечно, не решение вопроса.
 
Я всё же думаю, что разница во времени регистрации имеет значение. Протестируй это.
В каком смысле "время регистрации"? Я лично вообще хз, как подгружаются плагины. Может быть - одновременно. В таком случае, этого "время регистрации" не может существовать. Хотя если регистрировать команды в onLoad, то может что то изменится в плане времени)
 
У каждой комманды есть экзекутор (и не важно рефлексией ты ее регал, или не рефлексией). экзекутора может не быть, только если автор плуга долбень, и юзает PlayerCommandPreprocesEvent, но такие плуги надо удалять, а не юзать.

вернемся к нашим экзекуторам
Java:
PluginCommand cmd = Bukkit.getPluginCommand("yourCmd");
cmd.setExecutor(new yourExecutor());
Если попробуешь подсунуть null в экзекутор, то обломишься.


ну и если тебе захотелось вдруг поиграться рефлексией.
Java:
try {
     Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
     field.setAccessible(true);
     CommandMap map = (CommandMap)field.get(Bukkit.getServer());
     Field field2 = map.getClass().getDeclaredField("knownCommands");
     field2.setAccessible(true);
     HashMap<String, Command> knownCommands = (HashMap<String, Command>) field2.get(map);
     knownCommands.remove("yourCmd"); //тут комманда просто перестает существовать для сервера. Остается только заново ее зарегистрировать.
     field2.set(map, knownCommands);
     field2.setAccessible(false);
     field.setAccessible(false);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
     e.printStackTrace();
}
 
Последнее редактирование:
В каком смысле "время регистрации"? Я лично вообще хз, как подгружаются плагины. Может быть - одновременно. В таком случае, этого "время регистрации" не может существовать. Хотя если регистрировать команды в onLoad, то может что то изменится в плане времени)
Кстати, в способе @Blc_Dragon тебе тоже нужно регистрировать команду позже других плагинов.
Так что вот: http://rubukkit.org/threads/134693/#post-1444778
 
Прошло пару месяцов, а @Blc_Dragon по-прежнему выручает.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх