SF Plugin ImGui Scoreboard

AnWu

Guardian of Order
Автор темы
Всефорумный модератор
4,683
5,129
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 · Просмотры: 381
Последнее редактирование:

#Northn

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

Qsany

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

AnWu

Guardian of Order
Автор темы
Всефорумный модератор
4,683
5,129
Ходить нельзя когда открыт
знаю, пока хз как фиксить.
Так и знал что переведёшь, может быть зальёшь сурс?)
Ничем не отличается от луа, еще запутанее оболочка.

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

#Northn

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

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

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

AnWu

Guardian of Order
Автор темы
Всефорумный модератор
4,683
5,129
Всё же, у 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,581
1,300
Для того чтобы пед не стопался при открытии меню можно перенести функу из 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 · Просмотры: 587
  • Нравится
Реакции: Nekit Shultz

Musaigen

abobusnik
Проверенный
1,581
1,300
@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,177
@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

Guardian of Order
Автор темы
Всефорумный модератор
4,683
5,129
@Rio Добавь проверку в цикле поиска игроков:

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