- 4,770
- 5,377
Зависимости: SAMPFUNCS
Активация: Автоматическая
Вложения
Последнее редактирование:
знаю, пока хз как фиксить.Ходить нельзя когда открыт
Ничем не отличается от луа, еще запутанее оболочка.Так и знал что переведёшь, может быть зальёшь сурс?)
Всё же, у C++ тоже имеются свои особенности в отличии от луа, и хочется понять как нормально работать с c++ (я), по этому, было бы круто если бы залилзнаю, пока хз как фиксить.
Ничем не отличается от луа, еще запутанее оболочка.
По поводу плагина - он будет дополняться. В итоге должен получиться таб в стиле GTA V.
Всё же, у 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;
}
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, то будут каракули.Хомка, а кто эти люди ?
?z?
?o??Y?
@Qq?
А кто тебе говорил, что именно с клиента? Может на сервере благодаря плагину можно сменить ник на русский.с русскими никами не пускает в игру
с русскими никами не пускает в игру@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, то будут каракули.
пока хз) с кодировкой что-то. Зашел на вольво потестить и тоже самое.Хомка, а кто эти люди ?
?z?
?o??Y?
@Qq?
@Rio Добавь проверку в цикле поиска игроков:Хомка, а кто эти люди ?
?z?
?o??Y?
@Qq?
if (g_Players->iIsListed[playerID] != 1)
continue;
Проверку добавил, про второе не понял. Проблема ников не в том что их нет на сервере. Проблема в самом отображении ников.@Rio Добавь проверку в цикле поиска игроков:
Насчет таба, добавь вызов imgui wnd proc в CALLBACK wnd procC++:if (g_Players->iIsListed[playerID] != 1) continue;
добавь вот это в wnd procпро второе не понял
ImGui_ImplWin32_WndProcHandler(hwd, msg, wParam, lParam);