Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Замена в API

Тема в разделе "Разработка плагинов для новичков", создана пользователем molor, 27 фев 2017.

  1. Автор темы
    molor

    molor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    molore
    Привет.

    В ядре сервера, в классе Player есть метод (или функция?) teleport(Location location). Возможно ли с помощью плагина заменить его на свой, чтобы любой плагин, выполняющий перемещение игроков, обращался не к ядру, а к своему плагину? Спасибо.
     
  2. Хостинг MineCraft
    <
  3. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Возможно. Пожалуйста.
    PlayerTeleportEvent для слабаков.
     
  4. Автор темы
    molor

    molor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    molore
    Покажите примерный код? Я до таких "глубин кода" ещё не добирался и не представляю, как это делается, а тут ещё и проблема возникла, которую кроме как таким образом, больше не решить.
     
  5. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Процитируй полностью моё первое сообщение. Далее исходи из той информации что я тебе дал. У тебя в распоряжении должны быть хотя бы сурсы BukkitAPI, если ты не совсем отбитый.
     
  6. Автор темы
    molor

    molor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    molore
    Хорошо, опишу проблему полностью.

    Я ставлю setPassenger() игроку, после чего упомянутый Вами PlayerTeleportEvent не срабатывает вообще. Как бы я teleport() не вызывал. Если Вам интересно, что это за хрень, и почему телепортация не происходит - можете тоже посмотреть исходники. Я вот посмотрел и теперь не знаю, как решить этот вопрос, поэтому обратился к вам.
     
  7. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Установка пассажира вообще не вызывает кода телепортации (баккитовских, в ванили может быть все что угодно). Было бы классно, если бы ты расписал логику своего плагина.
     
  8. Автор темы
    molor

    molor Активный участник Пользователь

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

    Про логику, если я правильно понял: берётся моб, и делается пассажиром игрока. Свинка например. Всё, дальше игрок просто с ней ходит туда-сюда. И жалуется, что телепорты у него не работают.
     
  9. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    [​IMG]
    Событие должно вызываться.
    Хотя если Player == Vehicle, то нет. В этом случае поможет только правка этого метода.
     
  10. Автор темы
    molor

    molor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    molore
    Как я понял, принцип работы тут несколько другой.

    1.PNG 2.PNG

    Он вернёт true, если игрок имеет как минимум одного пассажира, ведь так? Если да, то эту проблему мне и нужно как-то решить..
     
  11. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
     
  12. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    С помощью плагина - нет.
    Тут два варианта:
    • Собирать ядро из исходников.
    • Динамически патчить классы с помощью либ ASM/Javassist. Потребуется написать свой "LaunchWrapper", чтобы править байткод классов, перед тем как они будут использованы.
     
  13. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Проще написать свой плагин-api где будет этот самый метод teleport, со всеми нужными функциями. При написании другого своего плагина вызываете метод teleport из апи-плагина. Всё.
     
  14. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Может твоя проблема в том, что ты дергаешь лузверь телепорт, вместо ентити телепорт.
     
  15. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Еще есть варианты cglib и aspectj
     
  16. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Медленнее, чем одноразовый патч.
     
  17. Автор темы
    molor

    molor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    molore
    Разницы нет.
     
  18. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну все - выбрасывай.
     
  19. CatCoder

    CatCoder Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CatCoder
    Можно конечно сделать извращение с созданием прокси Player'a с помощью либы cglib. Ну это как по мне не очень :(
     
  20. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    46
    Да тут делов то, свою либу написать и к ней обращаться.Как выше, CoolBoy написал.
     
  21. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    я так полагаю, что тогда надо будет переписать все плагины на телепорты, а это не весело

    в чем проблема ядро пропатчить?
     

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