[Pawn] Вопросы от Javekson

Статус
В этой теме нельзя размещать новые ответы.

d3m37r4

111111
Сообщения
1,429
Реакции
1,169
Помог
10 раз(а)
Javekson, используй PDS для сохранения запросов, которые не успели отправить перед сменой карты и отправляй уже при старте новой карты.
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
d3m37r4, а как я узнаю, какие запросы не успели отправится? )
 

d3m37r4

111111
Сообщения
1,429
Реакции
1,169
Помог
10 раз(а)
Javekson, Можно подготовить к отправке всё, что нужно, сохранив в памяти перед сменой карты, а после уже извлечь и отправить целиком.
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
d3m37r4, как я узнаю, когда будет смена карты? Возьмем какие-либо статистические данные об игроке, которые мы получаем при входе и сохраняем при выходе. Выход игрока производится раньше чем плугин_енд, интермишена вообще может и не быть, тот же restart например.
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
Так ты механики 2 сделай - на дисконект - обычная, на смену карты как посоветовал d3m37r4
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
Sonyx, я походу очень сильно туплю сейчас, либо я ужасно излагаю суть.
  1. В моем понимании смена карты это процессы: дисконнекты всех игроков - плугин_енд - карта ушла на смену
  2. В дисконнекте собираются данные и отправляются, на этом этапе мы не знаем будет ли смена карты или нет
  3. Идет плугин_енд на этом этапе игроков уже нету, а значит запросы выше уже сформированы и отправлены( так мы думаем )
  4. В случаи плохой базы - сервер виснит и ждет ответа, пока запросы выше все уйдут и придет ответ
  5. В случаи с грипом что успело - уйдет, что не успело обрежется, часть данных потеряется, в принципе мы это с тобой как раз обговаривали
26 Апр 2021
Да, запросы я делаю только при дисконнекте, я имею ввиду, что у нас случается, когда происходит смена карты
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
zhorzh78, 5сек * 32 игрока = более двух минут сервера офлайн
 
Сообщения
1,668
Реакции
1,495
Помог
24 раз(а)
Javekson, пуш по факту и ничего не делай в конце карты :dirol:
 

d3m37r4

111111
Сообщения
1,429
Реакции
1,169
Помог
10 раз(а)
@d3m37r4, как я узнаю, когда будет смена карты?
plugin_end - не смена карты? Ну вызывается дисконнект игрока раньше, ну подготовь запрос для вышедшего игрока (кстати, в reapi вынесен ClientDrop, который вызывается непосредственно при дисконнекте игрока, т.е. при смене карты, если игрок не отсоединился, форвард не должен вызваться).
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
plugin_end - не смена карты?
смена, процесс работы я описал выше, нужно не костыли придумывать а фиксить работу модулей, я так думаю.
В сорсе додумались до этого, а тут до сих пор ничего путного нету.
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
d3m37r4, нужно просто в gRipe стопорить поток если идет попытка смены карты, стопорить не для того, что бы получить ответы на запросы, а для того, что бы данные хотя бы были отправлены из основного потока, задержка будет в пределах 1сек. На сколько это возможно не знаю, но модуль мускула видать умеет это делать.

 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
Была задача воспроизводить звук при убийстве кого-либо с гранаты.
Задачу добавили, теперь нужно воспроизвести еще один звук при убийстве с гранаты самого себя.

Возник нюанс, если убивая себя с гранаты - захватываешь еще и врага, то звуки или перебивают друг друга или накладываются.

Задача: определить что при убийстве с гранаты самого себя ты параллельно не убил кого то еще. Есть идеи?
 

iPlague

♿️
Сообщения
230
Реакции
129
Помог
2 раз(а)
Javekson, а при убийстве двух и более игроков гранатой одновременно что происходит?
 
Сообщения
706
Реакции
476
Помог
10 раз(а)
тут только задержку делать и после чекать
еще и записывать кто кого там стукнул, а то граната пропадет и инфликтор уже у виктема будет невалиден к моменту со звуком
еще понять надо как ты там эмитишь
я вот не помню, сбрасывает ли объект старый звук, если на его канал отправить новый, т.е. создать временный объект, а потом стереть. Но это работает только для звука по радиусу, глобально такое не работает
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
iPlague, если в кратце, то воспроизведется звук для всех ST__SUICIDE, но если ты убил себя гранатой и захватил других, то должен быть ST__GRENADE, но увы, все также будет ST__SUICIDE, так-как хук hook_PlayerKilled_Post на убийство самого себя вызывается в последнюю очередь, а значит rg_send_audio перебьет все другие звуки

Код:
public hook_PlayerKilled_Post( const iVictim, const iKiller )
{
    if( iVictim == iKiller )
    {
        rg_send_audio( 0, KILL_SOUND[ ST__SUICIDE ] );
        
        return HC_CONTINUE;
    }
    
    if( !is_user_connected( iKiller ) )
    {
        return HC_CONTINUE;
    }
    
    new iInflictor = get_entvar( iVictim, var_dmg_inflictor );
    
    if( iInflictor != iKiller )
    {
        if( get_member( iVictim, m_bKilledByGrenade ) )
        {
            rg_send_audio( 0, KILL_SOUND[ ST__GRENADE ] );
        }
    }
    
    return HC_CONTINUE;
}
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
хук hook_PlayerKilled_Post на убийство самого себя вызывается в последнюю очередь
Всегда? Если да, то можно проверять факт убийства других, до того как убьёшь себя самого. Если кого-то убило, то не воспроизводить ST__SUICIDE.
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
BalbuR, ну в общем то RequestFrame помог( спасибо BlackSignature ) в данной ситуации, правда добавилось две глобалки
В грубой реализации выгледит так
C++:
public func_NextFrame( const id )
{
    if( g_bSuicide[ id ] && g_iNumKilled[ id ] <= 1 )
    {
        rg_send_audio( 0, KILL_SOUND[ ST__SUICIDE ] );
    }
   
    g_iNumKilled[ id ] = 0;
    g_bSuicide[ id ] = false;
}

public hook_PlayerKilled_Post( const iVictim, const iKiller )
{
    if( !is_user_connected( iKiller ) )
    {
        return HC_CONTINUE;
    }
   
    RequestFrame( "func_NextFrame", iKiller );
   
    g_iNumKilled[ iKiller ]++;
   
    if( iVictim == iKiller )
    {
        g_bSuicide[ iKiller ] = true;
       
        return HC_CONTINUE;
    }
   
    new iInflictor = get_entvar( iVictim, var_dmg_inflictor );
   
    if( iInflictor != iKiller )
    {
        if( get_member( iVictim, m_bKilledByGrenade ) )
        {
            rg_send_audio( 0, KILL_SOUND[ ST__GRENADE ] );
        }
        else if( get_member( iVictim, m_bKilledByBomb ) )
        {
            rg_send_audio( 0, KILL_SOUND[ ST__BOMB ] );
        }
    }
   
    return HC_CONTINUE;
}
7 Май 2021
Нашел еще нюанс, это касаемо суицида.
Если разбиться с высоты, то в RG_CBasePlayer_Killed аргумент iKiller будет равен 0, получается я рассмотрел не все ситуации суицида...
7 Май 2021
Если правильно понимаю придется чекать в RG_CBasePlayer_Killed - get_member( iVictim, m_bitsDamageType ) и проверять, что последний раз нанесло ему урон, от чего жертва умерла, верно?
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу