1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Не работает телепорт

Тема в разделе "Разработка плагинов для новичков", создана пользователем BeYkeR, 7 июн 2014.

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

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Всем добрый день. У меня только что случилась одна беда: не работает телепорт на требуемую локацию. Исходный код предоставлен ниже.

    Сорцы на GitHub

    Дело происходит так: Сначала игрок запускает обратный отсчет до старта. Затем через 5 секунд, плагин должен был отправить всех игроков по точкам, отправить сообщение и заспавнить шайбу, но выполняется только второе и третье. Может быть это из-за таймера ?
     
    Лайка3, Mr_RoboMan, Кувырок и 3 другим нравится это.
  2. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А что если players пустой?
     
    Последнее редактирование: 7 июн 2014
    Лайка3, Mr_RoboMan, Лайка2 и 2 другим нравится это.
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Код:
    private List<HockeyPlayer> players = new ArrayList<HockeyPlayer>();
    private List<HockeyPlayer> wingers = new ArrayList<HockeyPlayer>();
    private List<HockeyPlayer> defend = new ArrayList<HockeyPlayer>();
    Что за...
     
    Лайка3, Mr_RoboMan, Кувырок и ещё 1-му нравится это.
  4. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    serega6531, а что смущает? Списки игроков, ниже есть методы для "наполнения".

    BeYkeR, ни на что не ругается при этом?
    players не может быть пустым при вызове? А getBukkitPlayer()?
     
    Лайка3, Mr_RoboMan, Кувырок и 3 другим нравится это.
  5. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Три листа вместо одного Map с нужным параметром смущают.
     
    Лайка3, Mr_RoboMan, Кувырок и 3 другим нравится это.
  6. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    serega6531, ну когда у тебя есть только три переменных и больше не нужно, нет смысла объединять их в массив. Ну и вообще Map просто безумно медленнее чем List (правда это проявляется на большом количестве элементов).
     
    Лайка3, Mr_RoboMan, Кувырок и ещё 1-му нравится это.
  7. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    ИМХО будет намного экономнее и удобнее, если писать что-то вроде members.put(player, MemberType.DEFEND) и перебирать итератором.
     
  8. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    serega6531, в количестве букв - экономнее. Но это разный подход, к тому как делать.
    Если бы делал я -- у меня был Set или List, а HockeyPlayer содержал бы и тип игрока (защитник и т.п.) и заодно метод для телепортации.

    А вообще вера в HashMap у меня сильно пошатнулась, после того как я столкнулся с необходимостью оперировать большими данными. map.get("xxx") работало медленнее более чем в сотню раз по сравнению с простым перебором элементов List, в процессе поиска нужного.
     
    Лайка3, Mr_RoboMan, Кувырок и 2 другим нравится это.
  9. Автор темы
    BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Нет, players не пустой, проверял отправкой сообщения телепортирующим. Ошибок нет, делал дебаг, но ничего такого нету.
    Это у меня для лобби, чтобы игрок мог выбирать тип.
     
    Последнее редактирование: 8 июн 2014
  10. kirill2011s

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

    Баллы:
    103
    Может вы при телепортации передаете старый Location?

    Ну то есть в одном тике берете этот Location, а в следующем уже телепортируете?
     
  11. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Сделайте так, как сказал fromgate, сделайте один лист и храните роль в классе игрока.
     
  12. Автор темы
    BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Location у меня установлен заранее, так что он не меняется.
    А это что-то изменит ?
     
    Penek28123123, Лайка3, Mr_RoboMan и 4 другим нравится это.
  13. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Изменит.
     
    MaxBukkit, Penek28123123, Лайка3 и 7 другим нравится это.
  14. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    BeYkeR, а ничего не может телепортацию отменять? Телепортация игрока сопровождается вызовом события и если его что-то отменяет, то телепортации соответственно не будет.
     
    MaxBukkit, Penek28123123, Лайка3 и 10 другим нравится это.
  15. kirill2011s

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

    Баллы:
    103
    Если location установлен заранее, то в этом и проблема.
    Телепортация телепортирует игрока в мир установленный в этом location, а мир меняется с каждым тиком.
     
    MaxBukkit, Penek28123123, Лайка3 и 5 другим нравится это.
  16. Автор темы
    BeYkeR

    BeYkeR Старожил Девелопер Пользователь

    Баллы:
    173
    Спасибо , что напомнили про самый первый код, который написал при первоначальном плагине. Но я написал этот эвент , чтобы игрок не мог телепортироваться во время матча. Ну ладно, приду домой, проверю и что нибудь придумаю.
    Разве тик может менять Location ?
     
  17. kirill2011s

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

    Баллы:
    103
    Нет, вы не правильно поняли. Тик не меняет location. Тик меняет мир. А мир в вашем location остается таким как есть. Все ссылки на переменную мира сохраненного у вас уничтожаются, и сервер создает еще 1 мир.

    Эта проблема легко исправляется, если создать собственный класс позиции, и хранить там, допустим, только название мира и позиции x, y, z, а потом при телепорте брать данные из этого класса и создавать новый location с новыми данными.

    Понятно объяснил?
     
    MaxBukkit, Лайка3, RikkiL00k и 8 другим нравится это.
  18. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    kirill2011s, вообще не понятно ;)
     
  19. kirill2011s

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

    Баллы:
    103
    Есть объект location. В нем хранится ссылка на объект world. Объект world хранится где-то в ядре. С каждым тиком у объекта world вызывается метод .clone(), который создает новый объект world в ядре сервера и сервер далее уже взаимодействует с этим объектом ровно 1 тик. Когда проходит тик, все location продолжают ссылаться на устаревший world, в то время как сервер использует уже новый объект world. Когда вы пытаетесь телепортировать игрока по устаревшему location и попадаете на ссылку с устаревшим миром, соответственно вас никуда не телепортирует.
    Когда вы создаете новый location констуктором:

    Код:
    Location loc = new Location(world, x, y, z);
    
    Вы передаете ссылку на объект world, а не сам объект. Так-же делает и сервер.

    Решением этой проблемы является создание своего класса:

    Код:
    public class Pos {
    	public String worldName; //Название мира
    	public int x, y, z; //Позиция
    
    	public Pos(String name, int x, int y, int z) { //Констуктор
    		//Заполняем класс
    		worldName = name;
    		this.x = x;
    		this.y = y;
    		this.z = z;
    	}
    }
    
    Соответственно, этот класс инициализируется так:

    Код:
    Pos pos = new Pos("имя мира", 1, 2, 3)
    
    А дальнеяйшаяя телепортация выглядеть так:

    Код:
    World world = Bukkit.getWorld(pos.worldName);
    player.teleport(new Location(world, pos.x, pos.y, pos.z);
    
    И запомните все! В java все объекты(кроме не изменяемых типа int, long, String и т.д.) не передаются полностью, передается только ссылка на ячейку памяти в которой хранится объект.
     
  20. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А вы нигде не создаёте нового экземпляра класса Team? Тогда и могут получиться пусты переменные
     

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