Исходник ImGui Watermark for csgosimple

Начинающий
Статус
Оффлайн
Регистрация
27 Мар 2021
Сообщения
4
Реакции[?]
4
Поинты[?]
0
Screen:
Пожалуйста, авторизуйтесь для просмотра ссылки.


C++:
std::string comp_name() {

    char buff[MAX_PATH];
    GetEnvironmentVariableA("USERNAME", buff, MAX_PATH);

    return std::string(buff);
}

C++:
void Menu::watermark()
{
    if (!g_Options.misc.misc_watermark)
        return;

    auto t = std::time(nullptr);
    std::ostringstream time;
    time << std::put_time(std::localtime(&t), "%H:%M:%S");

    std::string Cheatname = ("Sunshine.space");

    auto watermark = Cheatname + (" | ") + comp_name() + (" | ") + time.str();

    if (g_EngineClient->IsInGame())
    {

        auto nci = g_EngineClient->GetNetChannelInfo();

        auto net_channel = g_EngineClient->GetNetChannelInfo();

        auto local_player = reinterpret_cast<C_BasePlayer*>(g_EntityList->GetClientEntity(g_EngineClient->GetLocalPlayer()));
        std::string outgoing = local_player ? std::to_string((int)(net_channel->GetLatency(FLOW_OUTGOING) * 1000)) : "0";


        if (nci)
        {
            auto server = nci->GetAddress();

            if (!strcmp(server, ("loopback")))
                server = ("local server");
            else
                server = ("valve server");

            auto tickrate = std::to_string((int)(1.0f / g_GlobalVars->interval_per_tick));

            watermark = Cheatname + (" | ") + comp_name() + (" | ") + server + (" | delay: ") + outgoing.c_str() + (" ms | ") + tickrate + (" tick | ") + time.str();
        }
    }
    ImVec2 p, s;
    ImGui::PushFont(g_SpectatorListFont);
    auto size_text = ImGui::CalcTextSize(watermark.c_str());
    ImGui::PopFont();
    ImGui::SetNextWindowSize(ImVec2(size_text.x + (Menu::Get().IsVisible() ? 24 : 14), 20));

    ImGui::Begin("watermark", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_::ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_::ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_::ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_::ImGuiWindowFlags_NoNav);
    {
        auto d = ImGui::GetWindowDrawList();
        p = ImGui::GetWindowPos();
        s = ImGui::GetWindowSize();
        ImGui::PushFont(g_SpectatorListFont);
        ImGui::SetWindowSize(ImVec2(s.x, 21 + 18));
        //
        d->AddRectFilled(p, p + ImVec2(s.x, 21), ImColor(39, 39, 39, int(50 * 1)));
        auto main_colf = ImColor(39, 39, 39, int(255 * 1));
        auto main_coll = ImColor(39, 39, 39, int(140 * 1));
        d->AddRectFilledMultiColor(p, p + ImVec2(s.x / 2, 20), main_coll, main_colf, main_colf, main_coll);
        d->AddRectFilledMultiColor(p + ImVec2(s.x / 2, 0), p + ImVec2(s.x, 20), main_colf, main_coll, main_coll, main_colf);
        //
        auto main_colf2 = ImColor(39, 39, 39, int(255 * min(1 * 2, 1.f)));
        d->AddRectFilledMultiColor(p, p + ImVec2(s.x / 2, 20), main_coll, main_colf2, main_colf2, main_coll);
        d->AddRectFilledMultiColor(p + ImVec2(s.x / 2, 0), p + ImVec2(s.x, 20), main_colf2, main_coll, main_coll, main_colf2);
        auto line_colf = ImColor(126, 131, 219, 200);
        auto line_coll = ImColor(126, 131, 219, 255);
        d->AddRectFilledMultiColor(p, p + ImVec2(s.x / 2, 2), line_coll, line_colf, line_colf, line_coll);
        d->AddRectFilledMultiColor(p + ImVec2(s.x / 2, 0), p + ImVec2(s.x, 2), line_colf, line_coll, line_coll, line_colf);
        d->AddText(p + ImVec2((Menu::Get().IsVisible() ? s.x - 10 : s.x) / 2 - size_text.x / 2, (20) / 2 - size_text.y / 2), ImColor(250, 250, 250, int(230 * min(1 * 3, 1.f))), watermark.c_str());
    }
    ImGui::End();
}
 
Последнее редактирование:
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,385
Реакции[?]
2,286
Поинты[?]
191K
Почему бы не возвращать строку как указатель? Вроде, так будет лучше, с точки производительности: const string *comp_name()
Алсо, тут буффер (второй параметр GetEnvironmentVariableA) в качестве указателя указывать нужно, у тебя ошибку не выдаёт в этом месте? Мне кажется, энивей лучше будет явное преобразование сделать: GetEnvironmentVariableA("USERNAME", (LPTSTR)buff, MAX_PATH);
const std::string currentDateTime()
Эту функцию ты решил сделать константой, почему тогда предыдущая неконстантная?) p.s. ну, вернее, тип возвращаемого значения, а не саму функцию.
if (g_Options.misc.misc_watermark) {
Лучше сделать проверку на неактивный misc_watermark, чтобы после избежать лишних отступов:
if (!g_Options.misc.misc_watermark)
return;

else if (g_GameRules->m_bIsValveDS()) server = ("valve server");
Тут можно было просто на else заменить, чтобы ненужного вызова m_bIsValveDS() избежать.
watermark = name_cheat + (" | ") + comp_name() + (" | ") + server + (" | delay: ") + outgoing.c_str() + (" ms | ") + tickrate + (" tick | ") + currentDateTime();
Можно было +=, либо push_back использовать, ну да ладно.
static bool seted = true; if (seted) seted = false; if (seted) ImGui::SetNextWindowPos(ImVec2(200, 200));
Не понимаю зачем это вообще нужно, если после твоего if (seted) seted = false следующая проверка вообще никогда не пройдёт.
auto main_colf = ImColor(39, 39, 39, int(255 * 1)); auto main_coll = ImColor(39, 39, 39, int(140 * 1));
Тут, ну и ещё в некоторых случаях, можно было переменные как constexpr/const объявить, на производительность может и не повлияет, но лично мне бы так комфортнее было.

В чём-то могу ошибаться, заранее извиняюсь.
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
2 Дек 2021
Сообщения
28
Реакции[?]
14
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1641814140134.png
Я конечно, понимаю много букав решают, но зачем в вотермарке 89 строк? Это можно было сделать в строк 12~18 =/
 
ЧВК EB_LAN
Забаненный
Статус
Оффлайн
Регистрация
12 Янв 2019
Сообщения
838
Реакции[?]
298
Поинты[?]
17K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему бы не возвращать строку как указатель? Вроде, так будет лучше, с точки производительности: const string *comp_name()
Алсо, тут буффер (второй параметр GetEnvironmentVariableA) в качестве указателя указывать нужно, у тебя ошибку не выдаёт в этом месте? Мне кажется, энивей лучше будет явное преобразование сделать: GetEnvironmentVariableA("USERNAME", (LPTSTR)buff, MAX_PATH);

Эту функцию ты решил сделать константой, почему тогда предыдущая неконстантная?) p.s. ну, вернее, тип возвращаемого значения, а не саму функцию.

Лучше сделать проверку на неактивный misc_watermark, чтобы после избежать лишних отступов:
if (!g_Options.misc.misc_watermark)
return;


Тут можно было просто на else заменить, чтобы ненужного вызова m_bIsValveDS() избежать.

Можно было +=, либо push_back использовать, ну да ладно.

Не понимаю зачем это вообще нужно, если после твоего if (seted) seted = false следующая проверка вообще никогда не пройдёт.

Тут, ну и ещё в некоторых случаях, можно было переменные как constexpr/const объявить, на производительность может и не повлияет, но лично мне бы так комфортнее было.

В чём-то могу ошибаться, заранее извиняюсь.
C++:
const std::string comp_name() {

    char buff[MAX_PATH];
    GetEnvironmentVariableA("USERNAME", (LPTSTR)buff, MAX_PATH);

    return std::string(buff);
}

const std::string currentDateTime() {
    time_t now = time(0);
    struct tm tstruct;
    char buf[80];
    tstruct = *localtime(&now);
    strftime(buf, sizeof(buf), "%X", &tstruct);

    return buf;
}

void Menu::watermark()
{
    if (!g_Options.misc.misc_watermark)
        return;

    std::string name_cheat = ("Cheat name");

    auto watermark = name_cheat + (" | ")+ comp_name() + (" | ") + currentDateTime();

    if (g_EngineClient->IsInGame())
    {
        auto nci = g_EngineClient->GetNetChannelInfo();

        auto net_channel = g_EngineClient->GetNetChannelInfo();

        auto local_player = reinterpret_cast<C_BasePlayer*>(g_EntityList->GetClientEntity(g_EngineClient->GetLocalPlayer()));
        std::string outgoing = local_player ? std::to_string((int)(net_channel->GetLatency(FLOW_OUTGOING) * 1000)) : "0";


        if (nci)
        {
            auto server = nci->GetAddress();

            if (!strcmp(server, ("loopback")))
                server = ("local server");
            else
                server = ("valve server");

            auto tickrate = std::to_string((int)(1.0f / g_GlobalVars->interval_per_tick));
            watermark += name_cheat + (" | ") + comp_name() + (" | ") + server + (" | delay: ") + outgoing.c_str() + (" ms | ") + tickrate + (" tick | ") + currentDateTime();
        }
    }

    ImVec2 p, s;
    ImGui::PushFont(g_SpectatorListFont);
    auto size_text = ImGui::CalcTextSize(watermark.c_str());
    ImGui::PopFont();
    ImGui::SetNextWindowSize(ImVec2(size_text.x + (Menu::Get().IsVisible() ? 24 : 14), 20));

    static bool seted = true;

    if (seted)
        seted = false;

    if (seted)
        ImGui::SetNextWindowPos(ImVec2(200, 200));

    ImGui::Begin("wwwwwwww", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_::ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_::ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_::ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_::ImGuiWindowFlags_NoNav);
    {
        auto d = ImGui::GetWindowDrawList();
        p = ImGui::GetWindowPos();
        s = ImGui::GetWindowSize();
        ImGui::PushFont(g_SpectatorListFont);
        ImGui::SetWindowSize(ImVec2(s.x, 21 + 18));

        d->AddRectFilled(p, p + ImVec2(s.x, 21), ImColor(39, 39, 39, int(50 * 1)));
        auto main_colf = ImColor(39, 39, 39, int(255 * 1));
        auto main_coll = ImColor(39, 39, 39, int(140 * 1));
        d->AddRectFilledMultiColor(p, p + ImVec2(s.x / 2, 20), main_coll, main_colf, main_colf, main_coll);
        d->AddRectFilledMultiColor(p + ImVec2(s.x / 2, 0), p + ImVec2(s.x, 20), main_colf, main_coll, main_coll, main_colf);

        auto main_colf2 = ImColor(39, 39, 39, int(255 * min(1 * 2, 1.f)));
        d->AddRectFilledMultiColor(p, p + ImVec2(s.x / 2, 20), main_coll, main_colf2, main_colf2, main_coll);
        d->AddRectFilledMultiColor(p + ImVec2(s.x / 2, 0), p + ImVec2(s.x, 20), main_colf2, main_coll, main_coll, main_colf2);
        auto line_colf = ImColor(126, 131, 219, 200);
        auto line_coll = ImColor(126, 131, 219, 255);
        d->AddRectFilledMultiColor(p, p + ImVec2(s.x / 2, 2), line_coll, line_colf, line_colf, line_coll);
        d->AddRectFilledMultiColor(p + ImVec2(s.x / 2, 0), p + ImVec2(s.x, 2), line_colf, line_coll, line_coll, line_colf);
        d->AddText(p + ImVec2((Menu::Get().IsVisible() ? s.x - 10 : s.x) / 2 - size_text.x / 2, (20) / 2 - size_text.y / 2), ImColor(250, 250, 250, int(230 * min(1 * 3, 1.f))), watermark.c_str());
    }
    ImGui::End();
}
держи перфекционист
 
Последнее редактирование:
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Почему бы не возвращать строку как указатель? Вроде, так будет лучше, с точки производительности: const string *comp_name()
Алсо, тут буффер (второй параметр GetEnvironmentVariableA) в качестве указателя указывать нужно, у тебя ошибку не выдаёт в этом месте? Мне кажется, энивей лучше будет явное преобразование сделать: GetEnvironmentVariableA("USERNAME", (LPTSTR)buff, MAX_PATH);
Дядь, ты ёбу дал? Т.е по твоему выделять память в куче это более производительно чем вернуть значение через стек? Строка конечно в любом случае выделит память у себя в конструкторе, но тыж блять ещё больше нагружаешь процессор выделением под саму строку. Плюс если строчка маленькая, то смолстринг позволит вообще не выделять память в ней. В общем ты херню сморозил в первом. Про второе я вообще молчу. КАКОЕ В ПИЗДУ ПРЕОБРАЗОВАНИЕ? Массив это хайлевел херня, по факту char buff[] зарезервирует в стеке место и вернёт указатель на него в переменную buff.
 
Похожие темы
Сверху Снизу