Init()
{
    level.startmessagedefaultduration = 2;
    level.regulargamemessages = spawnstruct();
    level.regulargamemessages.waittime = 6;

    thread OnPlayerConnect();
}

OnPlayerConnect()
{
    for ( ;; )
    {
        level waittill( "connecting", player );
        player thread DisplayPopupsWaiter();
    }
}

DisplayPopupsWaiter()
{
    self endon( "disconnect" );
    self.ranknotifyqueue = [];

    if ( !IsDefined( self.pers[ "challengeNotifyQueue" ] ) )
    {
        self.pers[ "challengeNotifyQueue" ] = [];
    }
    if ( !IsDefined( self.pers[ "contractNotifyQueue" ] ) )
    {
        self.pers[ "contractNotifyQueue" ] = [];
    }

    self.messagenotifyqueue = [];
    self.startmessagenotifyqueue = [];
    self.wagernotifyqueue = [];

    while ( !level.gameended )
    {
        if ( self.startmessagenotifyqueue.size == 0 && self.messagenotifyqueue.size == 0 )
        {
            self waittill( "received award" );
        }

        waittillframeend;

        if ( level.gameended )
        {
            return;
        }
        else
        {
            if ( self.startmessagenotifyqueue.size > 0 )
            {
                nextnotifydata = self.startmessagenotifyqueue[ 0 ];
                arrayremoveindex( self.startmessagenotifyqueue, 0, 0 );
                if ( IsDefined( nextnotifydata.duration ) )
                {
                    duration = nextnotifydata.duration;
                }
                else
                {
                    duration = level.startmessagedefaultduration;
                }

                self maps\mp\gametypes_zm\_hud_message::shownotifymessage( nextnotifydata, duration );
                wait ( duration );

                continue;
            }
            else if ( self.messagenotifyqueue.size > 0 )
            {
                nextnotifydata = self.messagenotifyqueue[ 0 ];
                arrayremoveindex( self.messagenotifyqueue, 0, 0 );

                if ( IsDefined( nextnotifydata.duration ) )
                {
                    duration = nextnotifydata.duration;
                }
                else
                {
                    duration = level.regulargamemessages.waittime;
                }

                self maps\mp\gametypes_zm\_hud_message::shownotifymessage( nextnotifydata, duration );
                continue;
            }
            else
            {
                wait ( 1 );
            }
        }
    }
}