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

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

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

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

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

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

    Сорцы на GitHub

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Понятно объяснил?
     
    MaxBukkit, Лайка3, RikkiL00k и 8 другим нравится это.
  15. 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 и т.д.) не передаются полностью, передается только ссылка на ячейку памяти в которой хранится объект.
     
  16. Den_Abr

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

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

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

    Баллы:
    173
    Да, вы угадали, спасибо вам :)
     

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