массивы слишком маленькие скорее всего.Надо было по быстрому сделать чекер 0 лвлов , сделал на быструю руку. Но проблема в том , что он выводит не до конца всех игроков. А просто обрезает половину.
сидел , пробовал и так и так , что-то не получилось вообщем доделать, подскажите кто нибудь, буду благодарен.
Код :
UPD:
Прокоментил строки
C++:#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS #include <windows.h> #include <string> #include <assert.h> #include <process.h> #include "SAMPFUNCS_API.h" #include "game_api\game_api.h" SAMPFUNCS *SF = new SAMPFUNCS(); int Score = 3; stFontInfo *pFont; char oldnick[4096] = { 0 }; char nick[4096]= { 0 }; bool bAct = false; void CALLBACK cmd_show_info_player(std::string param) { bAct ^= true; } bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion) { if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию { // рисуем if (bAct) { for (uint16_t it = 0; it < SAMP_MAX_PLAYERS; it++) // цикл игроков { SF->getSAMP()->getInfo()->UpdateScoreAndPing(); // обновляем таб if (!SF->getSAMP()->getPlayers()->iIsListed[it]) continue; // проверяем подключен ли игрок Score = SF->getSAMP()->getPlayers()->pRemotePlayer[it]->iScore; // Записываем в переменную лвл игрока if (Score == 0) // Проверяем что игрок 0 лвл. { sprintf(oldnick, "%s [%i]", SF->getSAMP()->getPlayers()->GetPlayerName(it), it); sprintf(nick, "%s \n %s", nick, oldnick); // и так всё понятно. } } pFont->Print(nick, D3DCOLOR_ARGB(170, 255, 255, 255), 500, 500, false); // Рисуем список sprintf(oldnick, ""); sprintf(nick, ""); // Очищаем переменные , что бы не было краша. } SF->getRender()->EndRender(); // завершаем рисование }; return true; // возвращаем положительный результат }; void CALLBACK mainloop() { static bool init = false; if (!init) { if (GAME == nullptr) return; if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return; if (!SF->getSAMP()->IsInitialized()) return; SF->getSAMP()->getInfo()->UpdateScoreAndPing(); SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present); pFont = SF->getRender()->CreateNewFont("Consolas", 10, FCR_BORDER); SF->getSAMP()->registerChatCommand("dauncheck", cmd_show_info_player); SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "SAMPFUNCS Plugin loaded." ); init = true; } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved) { switch (dwReasonForCall) { case DLL_PROCESS_ATTACH: SF->initPlugin(mainloop, hModule); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
Для каких целей? DrawBox попроще будет.Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?массивы слишком маленькие скорее всего.
25 - максимальная длина Ника, 1000 максимальное число игроков.
Посмотреть вложение 6326
З.Ы. А еще SF не умел рендерить больше 256 символов за раз, и вроде это не фиксилось
Я не думаю, что они так по уебански сделаны, и не склевают все в 1 строку, а выводят каждую строку отдельноскорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
Лучше самому отрисовать, но средствами DX9 (вертекс буффером).Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
CONST RGNDATA *pDirtyRegion)
{
if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию
{
// рисуем
SF->getRender()->DrawBox(50, 500, 100, 250, D3DCOLOR_ARGB(255, 0, 255, 0));
SF->getRender()->EndRender(); // завершаем рисование
};
return true; // возвращаем положительный результат
};
if (SF->getGame()->isKeyPressed('H')) // если нажата клавиша H (англ)
{
SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present); //Рисую блок
pFont = SF->getRender()->CreateNewFont("Tahoma", 12, FCR_BORDER);
pFont->Print("текст", D3DCOLOR_ARGB(255, 255, 255, 0), 45, 505, false); //Добавляю к нему текст
};
if (SUCCEEDED(SF->getRender()->BeginRender())) // если рендерер готов к рисованию
{
// рисуем
SF->getRender()->DrawBox(50, 500, 100, 250, D3DCOLOR_ARGB(255, 0, 255, 0));
pFont = SF->getRender()->CreateNewFont("Tahoma", 12, FCR_BORDER);
pFont->Print("текст", D3DCOLOR_ARGB(255, 255, 255, 0), 45, 505, false); //Добавляю к нему текст
SF->getRender()->EndRender(); // завершаем рисование
};
Он сам пропадает если перестать его рисоватьно вот как убрать отрисованый блок это я не нашел в API.
Шрифт достаточно создать один раз, где нибудь в цикле mainloop перед init = true;И ещё сразу вопрос
SF->getRender()->EndRender(); // завершаем рисованиеОн сам пропадает если перестать его рисовать
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
(Для примера)SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
if (SUCCEEDED(SF->getRender()->BeginRender()))
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive())
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive() && render == true)
Как тогда вызвать рисование 1 раз? Вопросов много, а доки нет, поэтому извиняйте.Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды.
Ну на работе у меня Ubuntu+Windows, но т.к. я работаю в Ubuntu то думал и это учить там же не перегружаясь, в SAMP я иногда захожу через Wine . Дома там же 2 операционки, но т.к. дома в основном с WIndows тут проблем нет, работаю с под неё.1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
if (SF->getGame()->isKeyPressed(VK_NUMPAD0))
{
char buf2[128];
char buf1[] = "Test";
sprintf(buf2, "[%d]\n[%d]\n[%d]\n[%d]\n[%d]", 0, 1, 2, 3, 4);
SF->getSAMP()->getDialog()->ShowDialog(1, 2, buf1, buf2, "Enter", "");
dialogWasActive = 1;
}
if (SF->getGame()->isKeyPressed(VK_ESCAPE))
{
dialogWasActive = 0;
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "esc");
}
if (!(SF->getSAMP()->getDialog()->iIsActive) & (dialogWasActive == 1))
{
int item = SF->getSAMP()->getDialog()->ListBoxGetIndex();
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "item = %d", item);
dialogWasActive = 0;
}