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

frosjkee

Участник
120
21

Dark_Knight

Me, me and me.
Друг
4,056
2,075
если SAMP API это кал, зачем его юзать?
Затем что ты придурок.
Я не понимаю как использовать sampapi, пожалуйста кто шарит за этот кал покажите будет выглядеть готовое решение, чтобы понять как с этим работать

C:
  [/B]
   {
                Sleep(1);
            }
            sampapi::v037r3::RefNetGame()->m_pSettings->m_bNoNametagsBehindWalls = true ;
        }
Нахера ты юзаешь sleep? Кидай весь код нам. Поможем.
 
  • Нравится
  • Грустно
Реакции: etereon и sc6ut

frosjkee

Участник
120
21
Затем что ты придурок.

Нахера ты юзаешь sleep? Кидай весь код нам. Поможем.
Да там обычный тест код пару строк, я не понимаю как работать с функциями из этого апи, в целом я неправильно начал функции и при компиляции ошибка, думаю чел который шарит поймет что я не правильно сделал, не обессудь просто хочу научится.
C:
[/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
Всефорумный модератор
899
1,743
SF. Как отлавливать, нажатие кнопок и какой пункт выбран?
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

bool test = false;

#define color_red "AA3333"
#define color_green "33AA33"

void CALLBACK hMenu(std::string param)
{
    char outMenu[9];

    sprintf(outMenu, "{%s}test",
        test ? color_green : color_red);

    if (param == "1")
        SF->getSAMP()->getChat()->AddChatMessage(-1, "фаст выбор тест");
    else
        return SF->getSAMP()->getDialog()->ShowDialog(8521, 2, "Title test", outMenu, "Выбрать", "Закрыть");
};

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Debug: {008000}SUCCESS");

            SF->getSAMP()->registerChatCommand("cout", hMenu);
            initialized = true;
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
 
  • Нравится
Реакции: James Saula

ufdhbi

Известный
Проверенный
1,456
861
SF. Как отлавливать, нажатие кнопок и какой пункт выбран?
C++:
#include <Windows.h>
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

bool test = false;

#define color_red "AA3333"
#define color_green "33AA33"

void CALLBACK hMenu(std::string param)
{
    char outMenu[9];

    sprintf(outMenu, "{%s}test",
        test ? color_green : color_red);

    if (param == "1")
        SF->getSAMP()->getChat()->AddChatMessage(-1, "фаст выбор тест");
    else
        return SF->getSAMP()->getDialog()->ShowDialog(8521, 2, "Title test", outMenu, "Выбрать", "Закрыть");
};

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "Debug: {008000}SUCCESS");

            SF->getSAMP()->registerChatCommand("cout", hMenu);
            initialized = true;
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}
ставить хук на диалог
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
899
1,743
ставить хук на диалог
Можешь объяснить как?
Просто это локальный диалог и в том же Lua можно было обойтись вот так:
Lua:
-- while true do
local result, button, list, input = sampHasDialogRespond(3333)
if result then
    if button == 1 then
        if list == 0 then
            -- code
        end
    end
end
 
  • Нравится
Реакции: James Saula

ufdhbi

Известный
Проверенный
1,456
861
Можешь объяснить как?
Просто это локальный диалог и в том же Lua можно было обойтись вот так:
Lua:
-- while true do
local result, button, list, input = sampHasDialogRespond(3333)
if result then
    if button == 1 then
        if list == 0 then
            -- code
        end
    end
end
Так же как и на серверный диалог, на вики есть пример на SF
 
Последнее редактирование модератором:
  • Нравится
Реакции: PanSeek

Musaigen

abobusnik
Проверенный
1,581
1,300
Так же как и на серверный диалог, на вики есть пример на 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,590
1,607
Как в 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,353
2,512
Как в 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
Всефорумный модератор
899
1,743
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