SF Plugin ImGui Scoreboard

AnWu

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,707
5,253
upload_2018-12-2_20-19-24.png
Установка: Файл scoreboard.sf переместить в папку SAMPFUNCS
Зависимости
: SAMPFUNCS
Активация
: Автоматическая
v1.0.2:
- Добавлен цвет ников

v1.0.1:
- Теперь можно ходить во время показа окна (спасибо MenuSDK @SR_team)
- Фикс отображения ников (спасибо @Rjx13)
- Новый шрифт Arial Bold.

v1.0.0:
- Релиз
 

Вложения

  • scoreboard.sf
    716.5 KB · Просмотры: 385
Последнее редактирование:

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,643
2,493
Так и знал что переведёшь, может быть зальёшь сурс?)
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ходить нельзя когда открыт
 

AnWu

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,707
5,253
Ходить нельзя когда открыт
знаю, пока хз как фиксить.
Так и знал что переведёшь, может быть зальёшь сурс?)
Ничем не отличается от луа, еще запутанее оболочка.

По поводу плагина - он будет дополняться. В итоге должен получиться таб в стиле GTA V.
 
  • Нравится
Реакции: Qsany

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,643
2,493
знаю, пока хз как фиксить.

Ничем не отличается от луа, еще запутанее оболочка.

По поводу плагина - он будет дополняться. В итоге должен получиться таб в стиле GTA V.
Всё же, у C++ тоже имеются свои особенности в отличии от луа, и хочется понять как нормально работать с c++ (я), по этому, было бы круто если бы залил
 

AnWu

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,707
5,253
Всё же, у C++ тоже имеются свои особенности в отличии от луа, и хочется понять как нормально работать с c++ (я), по этому, было бы круто если бы залил
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
#include "main.h"
#include "config.h"

bool init = false;

bool CALLBACK Present( CONST RECT *pSourceRect , CONST RECT *pDestRect , HWND hDestWindowOverride , CONST RGNDATA *pDirtyRegion )
{
    if( SUCCEEDED( SF->getRender()->BeginRender() ) && init )
    {
        if( !Config::g_MenuActive ) return true; // kill me pls
        ImGui::CreateContext();
        ImGui_ImplWin32_Init(GetActiveWindow());
        ImGui_ImplDX9_Init(SF->getRender()->getD3DDevice());
        if (!bChangeFont) {
            ImGuiIO io = ImGui::GetIO();
            ImFontConfig font_config;
            font_config.OversampleH = 1; //or 2 is the same
            font_config.OversampleV = 1;
            font_config.PixelSnapH = 1;

            static const ImWchar ranges[] =
            {
                0x0020, 0x00FF, // Basic Latin + Latin Supplement
                0x0400, 0x044F, // Cyrillic
                0,
            };
            TCHAR path[MAX_PATH];
            HRESULT hr = SHGetFolderPathA(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, path);
            std::string fPath = std::string(path).append("\\trebucbd.ttf");
            io.Fonts->AddFontFromFileTTF(fPath.c_str(), 15.0f, &font_config, ranges);
            bChangeFont = true;
        }
        ImGui_ImplDX9_NewFrame();
        ImGui_ImplWin32_NewFrame();
        ImGui::NewFrame();

        ImGuiIO IO = ImGui::GetIO();

        UpdateImGui();
        //ImGui::ShowStyleEditor(); // need imgui_demo
        int x, y;
        SF->getGame()->getScreenResolution(&x, &y);
        ImGui::SetNextWindowPos(ImVec2(x / 2.0f, y / 2.0f), 0, ImVec2(0.5f, 0.5f));
        ImGui::SetNextWindowSize(ImVec2(1280, 720));
        ImGui::Begin(SF->getSAMP()->getInfo()->szHostname, &Config::g_MenuActive , ImVec2( 550 , 550 ) , 0.9f, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove);
        ImVec2 size = ImGui::GetWindowSize();
        SF->getSAMP()->getInfo()->UpdateScoreAndPing();
        ImGui::Columns(4, "players");
        ImGui::SetColumnWidth(-1, 40.0f);
        ImGui::Text("ID");
        ImGui::NextColumn();
        ImGui::SetColumnWidth(-1, size.x - 220.0f);
        ImGui::Text(u8"Никнейм");
        ImGui::NextColumn();
        ImGui::SetColumnWidth(-1, 90.0f);
        ImGui::Text(u8"Счет");
        ImGui::NextColumn();
        ImGui::SetColumnWidth(-1, 90.0f);
        ImGui::Text(u8"Пинг");
        ImGui::NextColumn();
        ImGui::Separator();
        ImGui::Text("%d", SF->getSAMP()->getPlayers()->sLocalPlayerID);
        ImGui::NextColumn();
        ImGui::Text(SF->getSAMP()->getPlayers()->szLocalPlayerName);
        ImGui::NextColumn();
        ImGui::Text("%d", SF->getSAMP()->getPlayers()->iLocalPlayerScore);
        ImGui::NextColumn();
        ImGui::Text("%d", SF->getSAMP()->getPlayers()->iLocalPlayerPing);
        ImGui::NextColumn();
        ImGui::Separator();
        for (int i = 0; i < 1000; i++)
        {
            stRemotePlayer *player = SF->getSAMP()->getPlayers()->pRemotePlayer[i];
            if (player)
            {
                if (ImGui::Selectable(std::to_string(i).c_str(), false, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowDoubleClick))
                {
                    if (ImGui::IsMouseDoubleClicked(0))
                    {
                        SF->getSAMP()->sendClickPlayer(i, 0);
                        Config::g_MenuActive = false;
                    }
                }
                ImGui::NextColumn();
                ImGui::Text(player->szPlayerName);
                ImGui::NextColumn();
                ImGui::Text("%d", player->iScore);
                ImGui::NextColumn();
                ImGui::Text("%d", player->iPing);
                ImGui::NextColumn();
                ImGui::Separator();
            }
        }
        ImGui::Columns(1);
        ImGui::End();

        ImGui::EndFrame();
        ImGui::Render();
        ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
        SF->getRender()->EndRender();
    }
    return true;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg) {
    case WM_KEYDOWN:
        switch (LOWORD(wParam)) {
        case VK_TAB:
            Config::g_MenuActive = !Config::g_MenuActive;
            return 0;
        }
        break;
    case WM_KEYUP:
        switch (LOWORD(wParam)) {
        case VK_TAB:
            return 0;
        }
        break;
    }

    return CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam);
};
void CALLBACK mainloop()
{
    if (!init)
    {
        if (GAME == nullptr ||
            !SF->getSAMP()->IsInitialized() ||
            GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
        {
            init = false;
        }
        else {
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_RESET, Reset);
            SF->getGame()->registerWndProcCallback(SFGame::MEDIUM_CB_PRIORITY, WndProcHandler);
            SF->getGame()->registerGameDestructorCallback(PluginFree);
            HWND hwnd = GetForegroundWindow();
            pOldProc = (WNDPROC)SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG)WndProc);
            init = true;
        }
    }

    if( menustate != Config::g_MenuActive )
    {
        SF->getSAMP()->getMisc()->ToggleCursor( Config::g_MenuActive );
        menustate = Config::g_MenuActive;
    }
}

BOOL APIENTRY DllMain( HMODULE hModule , DWORD dwReasonForCall , LPVOID lpReserved )
{
    if( dwReasonForCall == DLL_PROCESS_ATTACH )
        SF->initPlugin( mainloop , hModule );
    return TRUE;   
}
main.cpp. первоначально использовал проект с подключенным имгуи от раггера
 
  • Нравится
Реакции: gedwadion и #Northn

Musaigen

abobusnik
Проверенный
1,585
1,310
Для того чтобы пед не стопался при открытии меню можно перенести функу из MenuSDK(ShowCursor, или _toggleCursor, я хз) и вместо SF->getSAMP()->getMisc()->ToggleCursor юзать ее.
 
  • Нравится
Реакции: AnWu

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Хомка, а кто эти люди ?
?z?
?o??Y?
@Qq?
 

Вложения

  • sa-mp-346.png
    sa-mp-346.png
    176.4 KB · Просмотры: 589
  • Нравится
Реакции: Nekit Shultz

Musaigen

abobusnik
Проверенный
1,585
1,310
@Rio
C++:
void _toggleSAMPCursor(int iToggle)
{
    void        *obj = *(void **)(SF->getSAMP()->getSAMPAddr() + 0x21A10C);
    ((void(__thiscall *) (void *, int, bool)) (SF->getSAMP()->getSAMPAddr() + 0x9BD30))(obj, iToggle ? 3 : 0, !iToggle);
    if (!iToggle)
        ((void(__thiscall *) (void *)) (SF->getSAMP()->getSAMPAddr() + 0x9BC10))(obj);
    // g_iCursorEnabled = iToggle;
}

void ShowCursor(bool State)
{
    static bool PrevStat = false;
    if (State)
    {
        _toggleSAMPCursor(1);
        if (!PrevStat)
            SetCursor(LoadCursor(NULL, IDC_ARROW)), PrevStat = true;
    }
    else
    {
        _toggleSAMPCursor(0);
        SetCursor(LoadCursor(NULL, NULL)), PrevStat = false;
    }
}

// ShowCursor(Config::g_MenuActive);

Хомка, а кто эти люди ?
?z?
?o??Y?
@Qq?
Русские ники (скорее всего), если не регистрировать шрифт c u8, то будут каракули.
с русскими никами не пускает в игру
А кто тебе говорил, что именно с клиента? Может на сервере благодаря плагину можно сменить ник на русский.
 

atizoff

приобретаю кашель за деньги
Проверенный
1,295
1,179
@Rio
C++:
void _toggleSAMPCursor(int iToggle)
{
    void        *obj = *(void **)(SF->getSAMP()->getSAMPAddr() + 0x21A10C);
    ((void(__thiscall *) (void *, int, bool)) (SF->getSAMP()->getSAMPAddr() + 0x9BD30))(obj, iToggle ? 3 : 0, !iToggle);
    if (!iToggle)
        ((void(__thiscall *) (void *)) (SF->getSAMP()->getSAMPAddr() + 0x9BC10))(obj);
    // g_iCursorEnabled = iToggle;
}

void ShowCursor(bool State)
{
    static bool PrevStat = false;
    if (State)
    {
        _toggleSAMPCursor(1);
        if (!PrevStat)
            SetCursor(LoadCursor(NULL, IDC_ARROW)), PrevStat = true;
    }
    else
    {
        _toggleSAMPCursor(0);
        SetCursor(LoadCursor(NULL, NULL)), PrevStat = false;
    }
}

// ShowCursor(Config::g_MenuActive);


Русские ники (скорее всего), если не регистрировать шрифт c u8, то будут каракули.
с русскими никами не пускает в игру
 

AnWu

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,707
5,253
@Rio Добавь проверку в цикле поиска игроков:

C++:
if (g_Players->iIsListed[playerID] != 1)
        continue;
Насчет таба, добавь вызов imgui wnd proc в CALLBACK wnd proc
Проверку добавил, про второе не понял. Проблема ников не в том что их нет на сервере. Проблема в самом отображении ников.