Как вывести статус онлайн персонажей.

webdes27

Легендарный
Проверенный
Победитель в номинации 2021
Победитель в номинации 2020
Победитель в номинации 2019
Светоч знаний
На страже закона
Часть системы
За заслуги перед форумом
Клиент разработчик
За веру и верность форуму
Сообщения
1 368
Розыгрыши
0
Решения
3
Репутация
3 899
Реакции
812
Баллы
1 733
Народ подскажите как вывести статус онлайн персонажа на птс. Используется GF+ext Epilogue от еressea (Emca).
Делаем лк под себя, не пойму как в ПТС узнать статус персонажа что бы вывести в личный кабинет.
Буду признателен за подсказку, за ранее премного благодарен.
 

Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
SELECT * FROM user_data WHERE char_name='test' and login

C++:
        return DB::select()
            ->from( "user_data" )
            ->where( "char_name", "=", $char_name)
            ->and_where( "login", ">", 0 )
 
C++:
        return DB::select()
            ->from( "user_data" )
            ->where( "char_name", "=", $char_name)
            ->and_where( "login", ">", 0 )
Это неправильный запрос, он вернет всех, кто когда-либо заходил в игру вообще

Правильно, WHERE login>logout, но и эти данные будут с погрешностью, т.к. кешед не всегда отображает эти данные в базе(например если упал сервер), а так же данные из кешеда в базу попадают с задержкой
 
@masone, с чего это вдруг С++? У меня нету класса db и функций select, where. Зачем мне слать 2 условия, если я могу в массиве передать, что необходимо в where. Была бы польза, а то вред...
 
Спасибо за информацию. Мне просто направление пинка было нужно, ну пока один из наиболее корректных предложил как я понял Xeonc, буду делать в таком виде, пока не придумаю более корректный способ. Спасибо всем кто помогал, буду признателен если будут варианты с реальным отображением, если это возможно.
 
@webdes27, тсп пакетом получение с кэшеда, с раз в н минут обновлением данных и посылкой пакета на получение онлайна.
 
@webdes27, тсп пакетом получение с кэшеда, с раз в н минут обновлением данных и посылкой пакета на получение онлайна.
Если я правильно понял вопрос - нужен не вывод онлайна вообще, а список персонажей, кто онлайн в данный момент. Я не знаю ни одного полноценного способа как это сделать, кроме этого способа с погрешностью
 
А ну значит я не правильно понял, то да скулем решить можно данный вопрос. Вообще стоит посмотреть оф сайты и корейцы мб и добавили в новых тронах. Да и может быть есть, надо разбирать кэшед.
 
Если я правильно понял вопрос - нужен не вывод онлайна вообще, а список персонажей, кто онлайн в данный момент. Я не знаю ни одного полноценного способа как это сделать, кроме этого способа с погрешностью
Вы меня правильно поняли! Думал можно через базу ибо не пойму как работать с пакетами через кешед по веб сокету и пояснить некому.)
 
предложение выше - было как раз через базу Select char_name from lin2world.dbo.user_data where login>logout
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
@masone, с чего это вдруг С++? У меня нету класса db и функций select, where. Зачем мне слать 2 условия, если я могу в массиве передать, что необходимо в where. Была бы польза, а то вред...
Я sql не увидел
 
Старый-престарый класс работы с CacheD, еще времен C4 от adriahu
Даже в нем есть пакет для получения статуса онлайна - смотри пакет CheckCharacter

З.Ы. для птс грации структуры некоторых пакетов вполне могли измениться, те же пакеты для управления предметами к примеру.
 

Вложения

SQL:
А это что?
Опять таки как похапэшный код, относится к SQL. И уж темболее С++
Думал можно через базу ибо не пойму как работать с пакетами через кешед по веб сокету и пояснить некому.
Для удобства лучше всего написать пакетный менеджер который приблизительно как в жабе сделан со своими структурами и т.д. Далее просто устанавливаешь коннект и шлешь необходимые пакеты. Запилить коннект дело 5 минут.
 
Для количества online-онлайн игроков просто посылается VersionPacket с ревизией клиента -3 на

C++:
bool packet000_VersionPacket(CIOSocket* pSocket, const uint8_t* packet)
{
    guard(__FUNCTIONW__);

    int clientProtocolRevision = 0;
    PacketUtils::Disassemble(packet, "d", &clientProtocolRevision);
    if (clientProtocolRevision == -1)
    {
        return false;
    }

    CUserSocket* socket = static_cast<CUserSocket*>(pSocket);
    if (clientProtocolRevision == -2)
    {
        socket->Send("cd", ServerToClientPacket_AdminSocket, 1);
        if (socket->IsUserSocket())
        {
            socket->SetSomeDebugInfo(true);
        }
        return true;
    }

    if (clientProtocolRevision == -3)
    {
        wchar_t buffer[0x100] = {0};
        DumpServerStats(buffer);
        if (g_npcServer.GetSocketCount() <= 0)
        {
            socket->Send("cdddddS", ServerToClientPacket_AdminSocket, 2, CServerStatistic::s_maxUsers, CServerStatistic::s_usersConnected, CServerStatistic::s_usersPlaying, CServerStatistic::s_privateStores, buffer);
        }
        else
        {
            socket->Send("cdddddS", ServerToClientPacket_AdminSocket, 1, CServerStatistic::s_maxUsers, CServerStatistic::s_usersConnected, CServerStatistic::s_usersPlaying, CServerStatistic::s_privateStores, buffer);
        }
        return false;
    }
    //...

Возможно, что в С4 и выше формат чуток поменяли (добавили что-то), но 000 пакет с отрицательными значениями и дальше используется для диагностики

Блин, сорри, статус онлайн персонажа, а не онлайн-статус персонажей... Тогда в CacheD admin sockets смотреть, там есть такой пакет
 
Блин, сорри, статус онлайн персонажа, а не онлайн-статус персонажей...
Бывает, я так же подумал :). Вон же @Gaikotsu уже написал.
Старый-престарый класс работы с CacheD, еще времен C4 от adriahu
Даже в нем есть пакет для получения статуса онлайна - смотри пакет CheckCharacter

@MasterToma, А и еще этот пакет вообще меняется очень редко и его вообще не меняли даже в ласт хрониках после камаэля.
 
Назад
Сверху Снизу