Другое SAMPFUNCS | API C++

Potniy

Режим чтения
5
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
 

SR_team

like pancake
BH Team
4,809
6,487
Надо было по быстрому сделать чекер 0 лвлов , сделал на быструю руку. Но проблема в том , что он выводит не до конца всех игроков. А просто обрезает половину.
сидел , пробовал и так и так , что-то не получилось вообщем доделать, подскажите кто нибудь, буду благодарен.

-McaK-ptmMs.jpg

Код :
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;
}
массивы слишком маленькие скорее всего.
25 - максимальная длина Ника, 1000 максимальное число игроков.
Screenshot_20161219-134839.png


З.Ы. А еще SF не умел рендерить больше 256 символов за раз, и вроде это не фиксилось
 

iAmerican

Известный
Друг
614
260
массивы слишком маленькие скорее всего.
25 - максимальная длина Ника, 1000 максимальное число игроков.
Посмотреть вложение 6326

З.Ы. А еще SF не умел рендерить больше 256 символов за раз, и вроде это не фиксилось
скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
 

SR_team

like pancake
BH Team
4,809
6,487
скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
Я не думаю, что они так по уебански сделаны, и не склевают все в 1 строку, а выводят каждую строку отдельно
 
  • Нравится
Реакции: Rorian

TheMY3

Известный
33
8
Наведите на правильную мысль, вот к примеру есть функция отрисовки:
C++:
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; // возвращаем положительный результат
};
В mainloop() я хочу сделать следующее:
C++:
    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); //Добавляю к нему текст
    };
Но сам вопрос, как мне скрывать этот блок при нажатии на другую клавишу? Я так понимаю надо будет вывести переменную глобально со статусом блока, но вот как убрать отрисованый блок это я не нашел в API.

И ещё сразу вопрос, когда я делаю сначала SF->getRender()->registerD3DCallback а потом текст, то я текст не вижу, а если в функцию добавлю текст:
C++:
    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(); // завершаем рисование
    };
То рисует текст поверх блока и вылетает клиент, как разместить нормально текст на блоке?
 
Последнее редактирование:

BlackKnigga

Известный
BH Team
922
446

TheMY3

Известный
33
8
Он сам пропадает если перестать его рисовать
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
 

BlackKnigga

Известный
BH Team
922
446
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).
 

2Shae

Известный
149
8
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
(Для примера)
Насчёт меню - делай проверку, замени:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()))
на
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive())
Аналогично с отображением, сделай глобальную переменную, к примеру, bool render и делай проверку на true/false:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive() && render == true)
 

TheMY3

Известный
33
8
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды.
Как тогда вызвать рисование 1 раз? Вопросов много, а доки нет, поэтому извиняйте.

И ещё вопрос, в консоли в игре есть дебаг мод, я могу отправлять сообщения в консоль вместо вывода в чат к примеру сообщения о том что происходит?
 
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,085
2,114
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
 

TheMY3

Известный
33
8
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
Ну на работе у меня Ubuntu+Windows, но т.к. я работаю в Ubuntu то думал и это учить там же не перегружаясь, в SAMP я иногда захожу через Wine . Дома там же 2 операционки, но т.к. дома в основном с WIndows тут проблем нет, работаю с под неё.
 

Oppenhem

Новичок
2
1
Есть диалог 2-ого стиля(LIST), нужно после его закрытия вывести номер последней выделенной строки. Но если диалог был закрыт с помощью ESC ничего не выводить.
C++:
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;
    }
Вроде всё правильно, но isKeyPressed(VK_ESCAPE) не работает в диалоге.