если SAMP API это кал, зачем его юзать?этот кал
если SAMP API это кал, зачем его юзать?этот кал
Нет другого апиесли SAMP API это кал, зачем его юзать?
Вы можете исправить код ?Если тебе нужно включить отображение ников через стены, то нужно ставить false
Если ты не умеешь водить на механике, а только на автомате - это ты тупой, а не МКППэтот кал
зач ты оффтопишь если знаешь помоги, объясни, покажи как нужноЕсли ты не умеешь водить на механике, а только на автомате - это ты тупой, а не МКПП
Затем что ты придурок.если SAMP API это кал, зачем его юзать?
Нахера ты юзаешь sleep? Кидай весь код нам. Поможем.Я не понимаю как использовать sampapi, пожалуйста кто шарит за этот кал покажите будет выглядеть готовое решение, чтобы понять как с этим работать
C:[/B] { Sleep(1); } sampapi::v037r3::RefNetGame()->m_pSettings->m_bNoNametagsBehindWalls = true ; }
Да там обычный тест код пару строк, я не понимаю как работать с функциями из этого апи, в целом я неправильно начал функции и при компиляции ошибка, думаю чел который шарит поймет что я не правильно сделал, не обессудь просто хочу научится.Затем что ты придурок.
Нахера ты юзаешь sleep? Кидай весь код нам. Поможем.
[/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;
}
#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;
}
ставить хук на диалог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; }
Можешь объяснить как?ставить хук на диалог
-- 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Можешь объяснить как?
Просто это локальный диалог и в том же 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
Гайд - API SF | Урок 4 - RakNet
Введение RakNet — это сетевой движок, используемый в SA:MP для обмена данными между игроками и сервером. Клиент отправляет пакет серверу, сервер его обрабатывает и рассылает другим игрокам — таким образом это работает. В этом уроке я покажу, как отправлять свои пакеты и заносить в них данные...www.blast.hk
SF->getSAMP()->registerDialogCallback(dialogCallback_t callback); // typedef void(__stdcall *dialogCallback_t)(int dialogId, int buttonId, int listItem, const char *input);
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)();
}
дык геймлуп вызывается с кадрамиКак в 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)(); }
DWORD dwLastTick = GetTickCount(); // в глобале
if (GetTickCount() - dwLastTick >= 1000)
{
dwLastTick = GetTickCount();
// код
}
или можно https://www.blast.hk/threads/10970/post-419257Как в 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)(); }
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
чуть знаю.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);
}
sampGetChatInfoPtr()
оно равно 0x17924EE0
- если все правильно сделал. Также как я понял оно находится здесь://SFSAMP.h
//class SAMPFUNCS_API SFSAMP
struct stChatInfo *getChat(void);