Другое С/С++ Вопрос - Ответ

Musaigen

abobusnik
Проверенный
1,608
1,366
Так же как и на серверный диалог, на вики есть пример на SF
SF->getSAMP()->registerDialogCallback(dialogCallback_t callback); // typedef void(__stdcall *dialogCallback_t)(int dialogId, int buttonId, int listItem, const char *input);
 
  • Нравится
Реакции: PanSeek
У

Удалённый пользователь 123482

Гость
Как в gameLoop'е исполнять свой код раз в секунду?
Пробовал такое, но похоже, что там задержка больше одной мс

C++:
void timerUpdateHooked() {
    static bool bIsInitialized = false;
    static unsigned int iTickedCount = 0;

    if (!bIsInitialized && SAMP::isInitialized()) {
        bIsInitialized = true;
    }
    
    if (bIsInitialized) {
        if (iTickedCount >= 1000) {
            iTickedCount = 0;
            // ...
        } else {
            iTickedCount++;
        }
    }

    ((void(__cdecl *)())g_Entry.m_pTimerUpdateHook->m_pTrampoline)();
}
 

Rei

Известный
Друг
1,616
1,671
Как в gameLoop'е исполнять свой код раз в секунду?
Пробовал такое, но похоже, что там задержка больше одной мс

C++:
void timerUpdateHooked() {
    static bool bIsInitialized = false;
    static unsigned int iTickedCount = 0;

    if (!bIsInitialized && SAMP::isInitialized()) {
        bIsInitialized = true;
    }
   
    if (bIsInitialized) {
        if (iTickedCount >= 1000) {
            iTickedCount = 0;
            // ...
        } else {
            iTickedCount++;
        }
    }

    ((void(__cdecl *)())g_Entry.m_pTimerUpdateHook->m_pTrampoline)();
}
дык геймлуп вызывается с кадрами
C++:
DWORD dwLastTick = GetTickCount(); // в глобале

if (GetTickCount() - dwLastTick >= 1000)
{
 dwLastTick = GetTickCount();
 // код
}
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,546
Как в gameLoop'е исполнять свой код раз в секунду?
Пробовал такое, но похоже, что там задержка больше одной мс

C++:
void timerUpdateHooked() {
    static bool bIsInitialized = false;
    static unsigned int iTickedCount = 0;

    if (!bIsInitialized && SAMP::isInitialized()) {
        bIsInitialized = true;
    }
   
    if (bIsInitialized) {
        if (iTickedCount >= 1000) {
            iTickedCount = 0;
            // ...
        } else {
            iTickedCount++;
        }
    }

    ((void(__cdecl *)())g_Entry.m_pTimerUpdateHook->m_pTrampoline)();
}
или можно https://www.blast.hk/threads/10970/post-419257
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,775
SF. Как правильно работать с памятью игры (видел гайды, но видимо что-то не то было либо я не понял), вот к примеру как это перевести в C++ из Lua
Lua:
local mem = require 'memory'
--
mem.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
mem.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
mem.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
Насчет std::memcpy чуть знаю.
Также видел такую функцию в полезных сниппетах для C++
C++:
void WriteMemory(void* address, void* bytes, int byteSize)
{
    DWORD NewProtection;
    VirtualProtect(address, byteSize, PAGE_EXECUTE_READWRITE, &NewProtection);
    std::memcpy(address, bytes, byteSize);
    VirtualProtect(address, byteSize, NewProtection, &NewProtection);
}
Но где-то принимается более 3-х аргументов.
Получил sampGetChatInfoPtr() оно равно 0x17924EE0 - если все правильно сделал. Также как я понял оно находится здесь:
C++:
//SFSAMP.h
//class SAMPFUNCS_API SFSAMP
struct stChatInfo                        *getChat(void);
 
  • Нравится
Реакции: James Saula

Musaigen

abobusnik
Проверенный
1,608
1,366
Также видел такую функцию в полезных сниппетах для C++
C++:
template<typename T>
void WriteMemory(void* address, T value)
{
    DWORD protect;
    
    VirtualProtect(address, sizeof(T), PAGE_EXECUTE_READWRITE, &protect);
    *reinterpret_cast<T*>(address) = value;
    VirtualProtect(address, sizeof(T), protect, &protect); // вместо &protect можно и nullptr
}
mem.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
C++:
void MemoryFill(void* address, int value, unsigned int size)
{
    DWORD protect;
    
    VirtualProtect(address, size, PAGE_EXECUTE_READWRITE, &protect);
    memset(address, value, size);
    VirtualProtect(address, size, protect, &protect);
}

SF. Как правильно работать с памятью игры (видел гайды, но видимо что-то не то было либо я не понял), вот к примеру как это перевести в C++ из Lua
Lua:
local mem = require 'memory'
--
mem.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
mem.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
mem.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
C++:
void ClearChat()
{
    stChatInfo* chat = SF->getSAMP()->getChat();
    
    MemoryFill(&chat->chatEntry, 0, sizeof(stChatEntry) * 100);
    
    chat->m_iRedraw = 1;
}
Вроде бы этого достаточно.
 
  • Влюблен
Реакции: PanSeek

frosjkee

Активный
122
25
sampapi покежьте как правильно использовать
Lua:
[/B]
#include "main.h"


void __cdecl DLLProject(void* pArg)
{
    while (true)
    {
        Sleep(1);
        if (GetAsyncKeyState(VK_END))
        {
            while (GetAsyncKeyState(VK_END))
            {
                Sleep(1);
            }
            sampapi::v037r3::RefNetGame()->m_pSettings->m_bNoNametagsBehindWalls = false;
        }
    }
}
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(DLLProject, NULL, nullptr);
    return TRUE;
}
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,775
sampapi покежьте как правильно использовать
Lua:
[/B]
#include "main.h"


void __cdecl DLLProject(void* pArg)
{
    while (true)
    {
        Sleep(1);
        if (GetAsyncKeyState(VK_END))
        {
            while (GetAsyncKeyState(VK_END))
            {
                Sleep(1);
            }
            sampapi::v037r3::RefNetGame()->m_pSettings->m_bNoNametagsBehindWalls = false;
        }
    }
}
BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(DLLProject, NULL, nullptr);
    return TRUE;
}
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.
C++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYUP:
        {
            switch (wParam)
            {
                case VK_END:
                {
                    sampapi::v037r3::RefNetGame()->m_pSettings->m_bNoNametagsBehindWalls = false;
                    break;
                }
            }
        }
    }
    return CallWindowProcA(WNDPROC(DLLProject.PrevWndFunc), hwnd, uMsg, wParam, lParam);
}
//WinAPI. Перерегистрировать WindowProc нужно
 
  • Нравится
Реакции: James Saula

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,813
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.
из DllMain WNDPROC хук не поставишь, если аси лоадером подргужать, к тому моменту окно игры еще не создано
 

frosjkee

Активный
122
25
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.
C++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYUP:
        {
            switch (wParam)
            {
                case VK_END:
                {
                    sampapi::v037r3::RefNetGame()->m_pSettings->m_bNoNametagsBehindWalls = false;
                    break;
                }
            }
        }
    }
    return CallWindowProcA(WNDPROC(DLLProject.PrevWndFunc), hwnd, uMsg, wParam, lParam);
}
//WinAPI. Перерегистрировать WindowProc нужно
Спасибо за помощь друголек, однако я неправильно вызываю функцию в этом коде и я не знаю как.
 

Krisp

Новичок
23
1
Ребят, может кто помочь фиксануть аимбот к ближайшей кости? У меня некоторые проблемки, черканите в лс, тк код не маленький
 

bottom_text

Известный
673
320
Как включить и выключить нормально такой курсор для ImGui окна без plugin sdk? Код kin4stat'a отсюда не выключает его
1619465098536.png
 
Последнее редактирование:

AdCKuY_DpO4uLa

Адский дрочер
Друг
317
675
Как включить и выключить нормально такой курсор для ImGui окна без plugin sdk? Код kin4stat'a отсюда не выключает его
Посмотреть вложение 94823
C++:
//enable
pSAMP->toggleSAMPCursor(1);
ImGui::GetIO().MouseDrawCursor = 1;
ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouseCursorChange;
//disable
pSAMP->toggleSAMPCursor(0);
ImGui::GetIO().MouseDrawCursor = 0;
ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;

toggleSAMPCursor
 
Последнее редактирование:
  • Нравится
Реакции: bottom_text