Defilak написал(а):
PlayerLoggedInEvent вызывается слишком рано. Попробуйте использовать EntityEvent.EntityConstructing для этого.
И вот это:
NBTTagCompound d = e.player.getEntityData();
if(!d.getBoolean("alreadybeeningame"))
{
MethodManager.onFirstJoin(p);
d.setBoolean("alreadybeeningame", true);
}
Действительно работает и корректно записывает данные?
Как сказал Драгон, это не будет работать.
А вот:
NBTTagCompound d = e.player.getEntityData();
if(!d.getBoolean("alreadybeeningame"))
{
MethodManager.onFirstJoin(p);
d.setBoolean("alreadybeeningame", true);
}
Полностью рабочий и валидный код
[merge_posts_bbcode]Добавлено: 30.10.2014 17:04:42[/merge_posts_bbcode]
Возможно есть какая-либо аналогия шедалера как в BukkitAPI?
[merge_posts_bbcode]Добавлено: 30.10.2014 17:15:58[/merge_posts_bbcode]
В документации нашел такую вещь как
ScheduledExecutorService. Уместно ли использовать?
[merge_posts_bbcode]Добавлено: 30.10.2014 17:38:42[/merge_posts_bbcode]
Попытался с помощью шедалера, в итоге такой код срабатывает (Метод onFirstJoin вызывается не сразу, а через 5 секунд после входа), но интерфейс по прежнему не открывает.
public class JoinHandler {
/**
* Шедалер, с помощью которого мы будем выполнять действие через определенное время
*/
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
@SubscribeEvent
public void OnFirstJoin(PlayerLoggedInEvent e)
{
final EntityPlayer p = e.player;
World w = e.player.worldObj;
NBTTagCompound d = e.player.getEntityData();
if(!d.getBoolean("alreadybeeningame"))
{
//Сообщение для проверки о срабатывание метода
System.out.println("JoinHandler executed");
//Создаем действие, которое будет вызывать метод
Runnable dealayedjoin = new Runnable(){
@Override
public void run() {
MethodManager.onFirstJoin(p);
}
};
//Указываем шедалеру что выполнить, через какой промежуток времени и единицы измерения времени
scheduler.schedule(dealayedjoin, 5, TimeUnit.SECONDS);
d.setBoolean("alreadybeeningame", true);
}
}
}