Войти или зарегистрироваться

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

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

BeYkeR

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

Сорцы на GitHub

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

BeYkeR, ни на что не ругается при этом?
players не может быть пустым при вызове? А getBukkitPlayer()?
 
serega6531, ну когда у тебя есть только три переменных и больше не нужно, нет смысла объединять их в массив. Ну и вообще Map просто безумно медленнее чем List (правда это проявляется на большом количестве элементов).
 
serega6531, ну когда у тебя есть только три переменных и больше не нужно, нет смысла объединять их в массив. Ну и вообще Map просто безумно медленнее чем List (правда это проявляется на большом количестве элементов).
ИМХО будет намного экономнее и удобнее, если писать что-то вроде members.put(player, MemberType.DEFEND) и перебирать итератором.
 
serega6531, в количестве букв - экономнее. Но это разный подход, к тому как делать.
Если бы делал я -- у меня был Set или List, а HockeyPlayer содержал бы и тип игрока (защитник и т.п.) и заодно метод для телепортации.

А вообще вера в HashMap у меня сильно пошатнулась, после того как я столкнулся с необходимостью оперировать большими данными. map.get("xxx") работало медленнее более чем в сотню раз по сравнению с простым перебором элементов List, в процессе поиска нужного.
 
А что если players пустой?
serega6531, а что смущает? Списки игроков, ниже есть методы для "наполнения".

BeYkeR, ни на что не ругается при этом?
players не может быть пустым при вызове? А getBukkitPlayer()?
Нет, players не пустой, проверял отправкой сообщения телепортирующим. Ошибок нет, делал дебаг, но ничего такого нету.
Код:
private List<HockeyPlayer> players = new ArrayList<HockeyPlayer>();
private List<HockeyPlayer> wingers = new ArrayList<HockeyPlayer>();
private List<HockeyPlayer> defend = new ArrayList<HockeyPlayer>();
Что за...
Это у меня для лобби, чтобы игрок мог выбирать тип.
 
Последнее редактирование:
Может вы при телепортации передаете старый Location?

Ну то есть в одном тике берете этот Location, а в следующем уже телепортируете?
Location у меня установлен заранее, так что он не меняется.
Сделайте так, как сказал fromgate, сделайте один лист и храните роль в классе игрока.
А это что-то изменит ?
 
BeYkeR, а ничего не может телепортацию отменять? Телепортация игрока сопровождается вызовом события и если его что-то отменяет, то телепортации соответственно не будет.
 
Location у меня установлен заранее, так что он не меняется.
Если location установлен заранее, то в этом и проблема.
Телепортация телепортирует игрока в мир установленный в этом location, а мир меняется с каждым тиком.
 
BeYkeR, а ничего не может телепортацию отменять? Телепортация игрока сопровождается вызовом события и если его что-то отменяет, то телепортации соответственно не будет.
Спасибо , что напомнили про самый первый код, который написал при первоначальном плагине. Но я написал этот эвент , чтобы игрок не мог телепортироваться во время матча. Ну ладно, приду домой, проверю и что нибудь придумаю.
Если location установлен заранее, то в этом и проблема,да и что нибудь прмдумаю.
Телепортация телепортирует игрока в мир установленный в этом location, а мир меняется с каждым тиком.
Разве тик может менять Location ?
 
Разве тик может менять Location ?

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

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

Понятно объяснил?
 
kirill2011s, вообще не понятно ;)

Есть объект 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 и т.д.) не передаются полностью, передается только ссылка на ячейку памяти в которой хранится объект.
 
Всем добрый день. У меня только что случилась одна беда: не работает телепорт на требуемую локацию. Исходный код предоставлен ниже.

Сорцы на GitHub

Дело происходит так: Сначала игрок запускает обратный отсчет до старта. Затем через 5 секунд, плагин должен был отправить всех игроков по точкам, отправить сообщение и заспавнить шайбу, но выполняется только второе и третье. Может быть это из-за таймера ?
А вы нигде не создаёте нового экземпляра класса Team? Тогда и могут получиться пусты переменные
 
Назад
Верх