Замена в API

  • Автор темы Автор темы molor
  • Дата начала Дата начала

molor

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

В ядре сервера, в классе Player есть метод (или функция?) teleport(Location location). Возможно ли с помощью плагина заменить его на свой, чтобы любой плагин, выполняющий перемещение игроков, обращался не к ядру, а к своему плагину? Спасибо.
 
Возможно. Пожалуйста.
PlayerTeleportEvent для слабаков.
 
Покажите примерный код? Я до таких "глубин кода" ещё не добирался и не представляю, как это делается, а тут ещё и проблема возникла, которую кроме как таким образом, больше не решить.
 
Покажите примерный код?
Процитируй полностью моё первое сообщение. Далее исходи из той информации что я тебе дал. У тебя в распоряжении должны быть хотя бы сурсы BukkitAPI, если ты не совсем отбитый.
 
Процитируй полностью моё первое сообщение. Далее исходи из той информации что я тебе дал. У тебя в распоряжении должны быть хотя бы сурсы BukkitAPI, если ты не совсем отбитый.
Хорошо, опишу проблему полностью.

Я ставлю setPassenger() игроку, после чего упомянутый Вами PlayerTeleportEvent не срабатывает вообще. Как бы я teleport() не вызывал. Если Вам интересно, что это за хрень, и почему телепортация не происходит - можете тоже посмотреть исходники. Я вот посмотрел и теперь не знаю, как решить этот вопрос, поэтому обратился к вам.
 
Установка пассажира вообще не вызывает кода телепортации (баккитовских, в ванили может быть все что угодно). Было бы классно, если бы ты расписал логику своего плагина.
 
Установка пассажира вообще не вызывает кода телепортации (баккитовских, в ванили может быть все что угодно). Было бы классно, если бы ты расписал логику своего плагина.
Ну так, проблема же в этом и заключается. Когда я заметил, что игроки с установленными пассажирами не могут быть перемещены, я решил приписать к PlayerTeleportEvent удаление пассажира перед телепортом в случае, если он есть. Но тут ведроAPI меня послало, а поиск решения этой проблемы в интернетах ни к чему не привёл. Хотя нет, было одно решение: удалять пассажира при вводе игроком команды телепортации (eg /spawn), но это костыль, да и не всегда отрабатывающий..

Про логику, если я правильно понял: берётся моб, и делается пассажиром игрока. Свинка например. Всё, дальше игрок просто с ней ходит туда-сюда. И жалуется, что телепорты у него не работают.
 
91f0b3c484.png
Событие должно вызываться.
Хотя если Player == Vehicle, то нет. В этом случае поможет только правка этого метода.
 
Как я понял, принцип работы тут несколько другой.

1.PNG 2.PNG

Он вернёт true, если игрок имеет как минимум одного пассажира, ведь так? Если да, то эту проблему мне и нужно как-то решить..
 
Проще написать свой плагин-api где будет этот самый метод teleport, со всеми нужными функциями. При написании другого своего плагина вызываете метод teleport из апи-плагина. Всё.
 
Может твоя проблема в том, что ты дергаешь лузверь телепорт, вместо ентити телепорт.
 
С помощью плагина - нет.
Тут два варианта:
  • Собирать ядро из исходников.
  • Динамически патчить классы с помощью либ ASM/Javassist. Потребуется написать свой "LaunchWrapper", чтобы править байткод классов, перед тем как они будут использованы.
Еще есть варианты cglib и aspectj
 
Можно конечно сделать извращение с созданием прокси Player'a с помощью либы cglib. Ну это как по мне не очень :(
 
Да тут делов то, свою либу написать и к ней обращаться.Как выше, CoolBoy написал.
 
Да тут делов то, свою либу написать и к ней обращаться.Как выше, CoolBoy написал.
я так полагаю, что тогда надо будет переписать все плагины на телепорты, а это не весело

в чем проблема ядро пропатчить?
 
я так полагаю, что тогда надо будет переписать все плагины на телепорты, а это не весело

в чем проблема ядро пропатчить?
Ну, вообще, если уже имеются плагины, которые не работают с пассажиром, то, лучше уже, наверное, пропатчить ядро.Но если ты собрался писать свои плагины, в которых будет телепорт, и стандартная реализация тебе не подходит, то пишешь либу со своей и используешь где нужно.А вообще, быть может, проблема совсем в другом и решается проще.
 
Назад
Верх