[1.7.2] Отображение интерфейса при первом входе

183
1
4
Добрый день
Цель: При первом входе игрока на сервер отобразить ему GuiScreen
Мое решение: Ловим PlayerLoggedInEvent и если флаг не установлен вызываем метод MethodManager.onFirstJoin в котором, в свою очередь, идет открытие интерфейса для игрока.
Проблема: Код не срабатывает, при первом входе игроку ничего не отображается
Мой код: ClientProxy , JoinHandler , MethodManager , GuiHandler , GuiClassChoose
 
183
1
4
Agravaine написал(а):
Гуи хандлер тут не нужен.Попробуй через Minecraft#displayGuiScreen(new GuiClassChoose());
И еще проверь, срабатывает ли твой ивент вообще.
Ивент срабатаывает. Попытка решить с помощью displayGuiScreen() не увенчалась успехом, все так-же ничего не происходит. Код ниже.
Код:
    public static Minecraft mc = Minecraft.getMinecraft();
Код:
public class MethodManager {
 public static void onFirstJoin(EntityPlayer p)
 {
 System.out.println("MethodManager.onFirstJoin executed");
 Core.mc.displayGuiScreen(new GuiClassChoose());
 
 }
}
 
34
0
PlayerLoggedInEvent вызывается слишком рано. Попробуйте использовать EntityEvent.EntityConstructing для этого.

И вот это:
Код:
NBTTagCompound d = e.player.getEntityData();
if(!d.getBoolean("alreadybeeningame"))
{
        MethodManager.onFirstJoin(p);
        d.setBoolean("alreadybeeningame", true);
}
Действительно работает и корректно записывает данные?
 
2,955
12
Вообще EntityConstructingEvent вызывается при создании инстансы энтити. То есть при вызове конструктора. Следовательно, в это время у энтити еще нет NBTTagCompound'a.
 
183
1
4
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);
        }
    }
}
 
Сверху