Скрытие радара

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Как можно нормально скрыть радар, чтобы остальные элементы худа при этом остались видимы?
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Никак. Есть клиентская кмд, но это такое.
 
  • Нравится
Реакции: Ayk
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
d3m37r4, точно никак? Я видел сервер, где скрыт радар, а всё остальное присутствует. И это не клиент кмд, поскольку я заходил с протектором
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Nordic Warrior, скинь скрин. Вон Denzer, уже скинул, что там биты затрагивают и радар и хп и армор.
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Ну это я в курсе как бы. Я поэтому и создал эту тему, что увидел такое в игре. Скрин сейчас не могу скинуть, компа нет.
Могу дать сервер:
Скрытое содержимое для пользователей: d3m37r4
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Nordic Warrior, там шлется hideradar, как я уже выше говорил. Слоухакингом такое себе заниматься.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Тогда почему протектор его не поймал? И я пытался писать drawradar, толку 0 было
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
d3m37r4, находясь на том сервере, дабы проверить
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Nordic Warrior, на серваке, с большой вероятностью, стоит ReCSDM, тот что Адидасмен выкладывал (там реализовано это путем засылания команды hideradar, пример см. ниже)
1585944174914.png
Поскольку в место индекса там 0 - .т.е срытие радара шлется всем игрокам, отсюда можно сделать вывод, что команда шлется неоднократно (как часто - это уже можно посмотреть в сурсах на битбакете, как часто вызывается форвард csdm_StateChange).
Отсюда и ответ, почему у тебя значение не поменялось, однако, если ты зайдешь на другой серв, после этого, у тебя радар будет выключен, и выполним команду drawradar, он появится.
P.S. не нужно искать ничего сверхъестественного. Как скрыть радар, выше уже предлагал Denzer. Скрываешь радар, хп и ап, по желанию городишь худ мессагой вывод хп/ап (пример тут правда сейчас он уже неактуален). Можно сделать отрисовку спрайтов по типу, как это реализовано в плагинах типа showequip/win team sprite (это уже идиотизм, тратить столько ресурсов на такую хрень). Но остается одна проблемка - помимо худа хп/ап и радара блочится и отображение урона, о чем я писал в этой теме. Решается также созданием стока с определением направления урона и отрисовкой худ мессаги, ну либо просто скринфейд шли, чтобы хоть какой-то индикатор получения урона был.
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Сейчас перепроверил еще раз:
Потом на других серверах его нет.
Радар сам появляется на других серверах. Это точно способ с hideradar?

И еще, d3m37r4, скачал предлагаемый модуль ReCSDM от Adidasman, установил там установку радара, и в отличие от того сервера, тут ловится протектором "hideradar".
 
Сообщения
212
Реакции
335
Помог
3 раз(а)
Я нашел два способа, но каждый из них проблематичный:
Первый способ:
C:
message_begin(MSG_ONE, get_user_msgid("Crosshair"), _, id)
write_byte(0)
message_end()

message_begin(MSG_ONE, get_user_msgid("CurWeapon"), _, id)
write_byte(1)
write_byte(-1)
write_byte(-1)
message_end()
В client.dll существует переменная m_bDrawRadar, отражающая статус отображения радара и используемая только на клиенте через консольные команды drawradar и hideradar. Но перед отображением радара также и проверяется статус gHUD.m_fPlayerDead, которая влияет не только на радар, и вот на этом моменте уже появляется проблема возможной подмены.

Код:
int CHudRadar::Draw(float flTime)
{
    return 0;

    if ((gHUD.m_iHideHUDDisplay & HIDEHUD_HEALTH) || g_iUser1)
        return 1;

    if (!gHUD.m_fPlayerDead && m_bDrawRadar == true)
        DrawRadar(flTime);

    return 1;
}
Код:
int CHudAmmo::MsgFunc_CurWeapon(const char *pszName, int iSize, void *pbuf)
{
    static wrect_t nullrc;
    int fOnTarget = FALSE;

    BEGIN_READ(pbuf, iSize);

    int iState = READ_BYTE();
    int iId = READ_BYTE();
    int iClip = READ_BYTE();

    if (iState > 1)
        fOnTarget = TRUE;

    if (iId < 1 && !m_bObserverCrosshair)
    {
        SetCrosshair(0, nullrc, 0, 0, 0);
        return 0;
    }

    if (g_iUser1 != OBS_IN_EYE)
    {
        if ((iId == -1) && (iClip == -1))
        {
            gHUD.m_fPlayerDead = TRUE;
            gpActiveSel = NULL;
            return g_pfnMSG_CurWeapon(pszName, iSize, pbuf);
        }

        gHUD.m_fPlayerDead = FALSE;
    }

    ...
}
Ничего не остаётся кроме как подменить m_fPlayerDead, но здесь теперь мешает m_bObserverCrosshair... Его, вроде бы, можно безболезненно подменить, отправив с drawn = 0, но что произойдет в последствии я еще изучал. Известно только то, что после отправки он не проявляется.
Код:
int CHudAmmo::MsgFunc_Crosshair(const char *pszName, int iSize, void *pbuf)
{
    BEGIN_READ(pbuf, iSize);

    static wrect_t nullrc;
    bool drawn = READ_BYTE();

    if (gEngfuncs.IsSpectateOnly())
        return 1;

    if (gEngfuncs.pfnGetCvarFloat("cl_observercrosshair") == 0)
        return 1;

    if (drawn)
    {
        SetCrosshair(m_hObserverCrosshair, m_rcObserverCrosshair, 255, 255, 255);
    }
    else
    {
        SetCrosshair(0, nullrc, 0, 0, 0);
    }

    m_bObserverCrosshair = true;
    return 1;
}
А теперь последствия, которые я заметил сразу, когда начал отсылать такие обновления каждый CurWeapon:
а) Худ патронов либо заморожен либо отстает на один выстрел в зависимости от способа хука. Не фиксится.
б) Пропала точка в зуме у снайперок.
в) Если хукнуть в pre, то прицел будет одинакового размера на любом оружии, но при этом останется динамическим.
И это то, что я заметил. Я вполне уверен, что проблем немного больше, но они связаны с оружием и этот способ будет нормальный, если используется только при ноже (привет jailbreak серверам и мафии).

Второй способ:
C:
message_begin(MSG_ONE, get_user_msgid("ScoreAttrib"), _, id)
write_byte(id)
write_byte(SCOREATTRIB_DEAD) // (1<<0)
message_end()
Отправляем мессагу клиету об его статусе в таблице счёта что он умер. Последствия в таблице счёта: только мы видим, что мы мертвы, но на самом деле нет.
Код:
void CHudRadar::DrawRadar(float flTime)
{
    ...

    if (g_PlayerExtraInfo[gHUD.m_iPlayerNum].dead == true)
        return;

    if (cl_radartype && cl_radartype->value != 0)
    {
        SPR_Set(m_hRadaropaque, 200, 200, 200);
        SPR_DrawHoles(0, 0, 0, m_hradopaque);
    }
    else
    {
        SPR_Set(m_hRadar, 25, 75, 25);
        SPR_DrawAdditive(0, 0, 0, m_hrad);
    }

    ...
}
Единственная проверка на g_PlayerExtraInfo[gHUD.m_iPlayerNum].dead и сразу рендеринг. Без шансов. Единственное что — еще можно обмануть, отправив DeathMsg самому себе по аналогии, но кто знает как отправить невидимый DeathMsg кому либо?

Не знаю, больше ничего не нашел. Есть вообще какие-то замечания исходя из всего этого конкретно на том сервере, где было замечено скрытие радара?
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Есть вообще какие-то замечания исходя из всего этого конкретно на том сервере, где было замечено скрытие радара?
Да, есть.
Вот это:
Последствия в таблице счёта: только мы видим, что мы мертвы, но на самом деле нет.
Постоянно висит Dead на себе.
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Xelson, оно того не стоит.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Xelson, еще один вариант, но также не без проблем
Код:
for (int i = 1; i <= MAX_CLIENTS; i++)
{
    GetPlayerInfo(i, &g_PlayerInfoList[i]);

    if (g_PlayerInfoList[i].thisplayer)
        m_iPlayerNum = i;
}
Тут можно попробовать подменить m_iPlayerNum. Чуствует моя жопа, что багов только прибавится
 
  • Нравится
Реакции: Ayk
Статус
В этой теме нельзя размещать новые ответы.

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

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