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

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

Discussion in 'Разработка плагинов для новичков' started by BeYkeR, Jun 7, 2014.

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

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

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

    Сорцы на GitHub

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

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

    Trophy Points:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А что если players пустой?
     
    Last edited: Jun 7, 2014
  4. serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Code:
    private List<HockeyPlayer> players = new ArrayList<HockeyPlayer>();
    private List<HockeyPlayer> wingers = new ArrayList<HockeyPlayer>();
    private List<HockeyPlayer> defend = new ArrayList<HockeyPlayer>();
    Что за...
     
  5. serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Три листа вместо одного Map с нужным параметром смущают.
     
  6. serega6531

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    173
    Location у меня установлен заранее, так что он не меняется.
    А это что-то изменит ?
     
  11. serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Изменит.
     
  12. kirill2011s

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

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

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

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

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

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

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

    Понятно объяснил?
     
  15. kirill2011s

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

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

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

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

    Code:
    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;
    	}
    }
    
    Соответственно, этот класс инициализируется так:

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

    Code:
    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 Старожил Девелопер Пользователь

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

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

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

Share This Page