офкос ты не закроешь диалог, который ещё не получил от сервера. закрывай после хука.Также пробовал закрывать диалог через SF->getSAMP()->getDialog()->Close(1);
офкос ты не закроешь диалог, который ещё не получил от сервера. закрывай после хука.Также пробовал закрывать диалог через SF->getSAMP()->getDialog()->Close(1);
void SendDialogResponse(WORD wDialogID, BYTE bButtonID, WORD wListBoxItem = 65535, char *szInputResp = "")
{
BitStream bsSend;
BYTE respLen = static_cast<BYTE>(strlen(szInputResp));
bsSend.ResetWritePointer();
bsSend.Write(wDialogID);
bsSend.Write(bButtonID);
bsSend.Write(wListBoxItem);
bsSend.Write(respLen);
bsSend.Write(szInputResp, respLen);
SAMP->RPC(RPC_DialogResponse, &bsSend, HIGH_PRIORITY, RELIABLE_ORDERED, NULL, false);
}
SendDialogResponse(0, 0); // 0 - id диалога
case RPC_ShowDialog:
{
if (cheat_state->_generic.cheat_panic_enabled)
break;
WORD DialogID;
BYTE style, caplen, button1_len, button2_len, button = 1;
char caption[255], button1[25], button2[25], info[256];
BitStream bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
bsData.ResetReadPointer();
bsData.Read(DialogID);
bsData.Read(style);
bsData.Read(caplen);
bsData.Read(caption, caplen);
caption[caplen] = '\0';
bsData.Read(button1_len);
bsData.Read(button1, button1_len);
button1[button1_len] = '\0';
bsData.Read(button2_len);
bsData.Read(button2, button2_len);
button2[button2_len] = '\0';
stringCompressor->DecodeString(info, 256, &bsData);
break;
}
info, 0x1000, &bsData
Это в аргументы DecodeString
потому что вместо этого надо читать длину строки и использовать ее в декодированииПробовал так, всё равно эффект тот же
1>e:\samp\sampfuncs sdk\sf plugin template\sfplugin\sfapi\SFRender.h(5): fatal error C1083: Cannot open include file: 'd3dx9.h': No such file or
Требуется установка DirectX SDKПри компиляции плагина получаю следующую строку:
1>e:\samp\sampfuncs sdk\sf plugin template\sfplugin\sfapi\SFRender.h(5): fatal error C1083: Cannot open include file: 'd3dx9.h': No such file or
Где взять d3dx9.h?
Решение:
как реализована эта функция?
C++:bool SFSAMP::registerChatCommand(std::string command, CommandProc callback)
#include <Windows.h>
#include "main.h"
SAMPFUNCS *SF = new SAMPFUNCS();
void __stdcall mainloop()
{
static bool initialized = false;
if (!initialized)
{
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
initialized = true;
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(104, 255, 192), "@@@");
}
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
if (dwReasonForCall == DLL_PROCESS_ATTACH)
{
SF->initPlugin(mainloop, hModule);
// ...
}
if (dwReasonForCall == DLL_PROCESS_DETACH)
{
// ...
}
return TRUE;
}
Привет, сталкивался с похожей проблемой и мне помогало лишь полная замена проекта на стандартный сфовский от urshadowКто-нибудь сталкивался с подобным? В какой-то момент перестал полностью выгружаться плагин. Не важно, как я его заполню, он всё равно полностью не выгружается. DLL_PROCESS_DETACH не вызывается при выгрузке (но вызывается, когда полностью из игры выходишь ), при этом все команды освобождаются, но сам плагин как бы подключён, но SF его уже не видит, и когда снова пытаешься выгрузить плагин, в консоли пишет, что такой плагин не найден. Есть решение?
Вот обычный пример:
main.cpp:#include <Windows.h> #include "main.h" SAMPFUNCS *SF = new SAMPFUNCS(); void __stdcall mainloop() { static bool initialized = false; if (!initialized) { if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized()) { initialized = true; SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(104, 255, 192), "@@@"); } } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) { if (dwReasonForCall == DLL_PROCESS_ATTACH) { SF->initPlugin(mainloop, hModule); // ... } if (dwReasonForCall == DLL_PROCESS_DETACH) { // ... } return TRUE; }