1. Внимание!
    Объявились мошенники, которые представляются администрацией форума и обманывают покупателей. У них есть своя группа ВКонтакте, копирующая нашу, и несколько аккаунтов, маскирующихся под аккаунты администраторов и гарантов форума.
    При проведении любых сделок с администраторами, гарантами и пользователями BlastHack настойчиво требуйте у них написать вам личное сообщение на форуме и ни в коем случае не продолжайте сделку при отказе выполнять это требование или если сообщение не было получено.

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

Тема в разделе "C, C++", создана пользователем urShadow, 5 дек 2014.

  1. iAmerican

    iAmerican Известный пользователь

    Регистрация:
    17.02.14
    Сообщения:
    306
    Лайки:
    62
    Репутация:
    11
    Надо было по быстрому сделать чекер 0 лвлов , сделал на быструю руку. Но проблема в том , что он выводит не до конца всех игроков. А просто обрезает половину.
    сидел , пробовал и так и так , что-то не получилось вообщем доделать, подскажите кто нибудь, буду благодарен.

    [​IMG]

    Код :
    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;
    }
     
    #1921
  2. AWRage

    Проверенный

    Регистрация:
    10.07.15
    Сообщения:
    642
    Лайки:
    115
    Репутация:
    56
    Как получить имя автомобиля, имея его CVehicle? Или хотя бы тип.
     
    #1922
  3. Ice

    Ice Пользователь

    Регистрация:
    12.01.15
    Сообщения:
    24
    Лайки:
    2
    Репутация:
    2
    Код (C++):
    Выделить всё двойным кликом
    pVehicle->GetModelIndex();
    A za ime ne znaju no mozhes vzyat array iz pawno gde to i perepisat dlja C/C++
     
    #1923
  4. AWRage

    Проверенный

    Регистрация:
    10.07.15
    Сообщения:
    642
    Лайки:
    115
    Репутация:
    56
    Уже сделал, спасибо. Я почему-то думал что функция имеет название типа GetType().
     
    #1924
  5. DarkP1xel

    DarkP1xel Δ9
    BH Team

    Регистрация:
    17.06.13
    Сообщения:
    2.011
    Лайки:
    1.213
    Репутация:
    318
    В GetModel кажется есть func GetNameIfVehicle
     
    #1925
  6. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    506
    Лайки:
    119
    Репутация:
    56
    Как загрузить шрифт из .ttf файла?
     
    #1926
  7. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    411
    Лайки:
    266
    Репутация:
    39
    AddFontResource('Путь') ;
     
    #1927
    BlackKnigga нравится это.
  8. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    506
    Лайки:
    119
    Репутация:
    56
    Окей, а как тогда получить его название в системе(чтобы создать через CreateNewFont())? При установке он переименовывается в ""шрифтнейм" полужирный". Какие только названия не вводил, загружается какой-то стандартный шрифт(вроде Arial'а).
     
    #1928
  9. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    411
    Лайки:
    266
    Репутация:
    39
    Ненубы, помогайте с перехватом ScrClientMessage
    Чё не так делаю?
    Код (C++):
    Выделить всё двойным кликом
    D3DCOLOR MessageColor; // Цвет сообщения
    byte textLen; // Длина сообщения
    char textMessage[144]; // Сообщение
    params->bitStream->ResetReadPointer();
    params->bitStream->Read(MessageColor);
    params->bitStream->Read(textLen);
    params->bitStream->Read(textMessage);
    textMessage[textLen] = '\0';
    params->bitStream->ResetReadPointer();
     
    #1929
  10. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    506
    Лайки:
    119
    Репутация:
    56
    TextLen дворд, а не байт.
    https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1
     
    Последние данные очков репутации:
    Sire: 2 Очки 17 дек 2016
    #1930
  11. CarLCas

    CarLCas Известный пользователь

    Регистрация:
    12.07.13
    Сообщения:
    143
    Лайки:
    29
    Репутация:
    16
    params->bitStream->Read(textMessage, textLen);
     
    Последние данные очков репутации:
    Sire: 2 Очки 17 дек 2016
    #1931
  12. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    411
    Лайки:
    266
    Репутация:
    39
    от души пацаны
     
    #1932
  13. Potniy

    Potniy Заблокирован

    Регистрация:
    19.12.16
    Сообщения:
    5
    Лайки:
    2
    Репутация:
    0
    Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
     
    #1933
  14. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.600
    Лайки:
    1.554
    Репутация:
    417
    массивы слишком маленькие скорее всего.
    25 - максимальная длина Ника, 1000 максимальное число игроков.
    Screenshot_20161219-134839.png

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

    iAmerican Известный пользователь

    Регистрация:
    17.02.14
    Сообщения:
    306
    Лайки:
    62
    Репутация:
    11
    Для каких целей? DrawBox попроще будет.
     
    #1935
  16. iAmerican

    iAmerican Известный пользователь

    Регистрация:
    17.02.14
    Сообщения:
    306
    Лайки:
    62
    Репутация:
    11
    скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
     
    #1936
  17. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.600
    Лайки:
    1.554
    Репутация:
    417
    Я не думаю, что они так по уебански сделаны, и не склевают все в 1 строку, а выводят каждую строку отдельно
     
    #1937
    Rorian нравится это.
  18. NarutoUA

    NarutoUA C++ Hokage developer
    BH Team

    Регистрация:
    26.05.13
    Сообщения:
    557
    Лайки:
    606
    Репутация:
    284
    Лучше самому отрисовать, но средствами DX9 (вертекс буффером).
     
    #1938
  19. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Наведите на правильную мысль, вот к примеру есть функция отрисовки:
    Код (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(); // завершаем рисование
        };
    То рисует текст поверх блока и вылетает клиент, как разместить нормально текст на блоке?
     
    #1939
    Последнее редактирование: 27 дек 2016
  20. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    506
    Лайки:
    119
    Репутация:
    56
    Он сам пропадает если перестать его рисовать

    Шрифт достаточно создать один раз, где нибудь в цикле mainloop перед init = true;
     
    #1940
  21. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    SF->getRender()->EndRender(); // завершаем рисование
    Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
     
    #1941
  22. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    506
    Лайки:
    119
    Репутация:
    56
    Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).
     
    #1942
  23. 2Shae

    2Shae Известный пользователь

    Регистрация:
    14.05.14
    Сообщения:
    98
    Лайки:
    5
    Репутация:
    4
    (Для примера)
    Насчёт меню - делай проверку, замени:
    Код (Text):
    Выделить всё двойным кликом
    if (SUCCEEDED(SF->getRender()->BeginRender()))
    на
    Код (Text):
    Выделить всё двойным кликом
    if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive())
    Аналогично с отображением, сделай глобальную переменную, к примеру, bool render и делай проверку на true/false:
    Код (Text):
    Выделить всё двойным кликом
    if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive() && render == true)
     
    #1943
  24. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Как тогда вызвать рисование 1 раз? Вопросов много, а доки нет, поэтому извиняйте.

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

    Dark_Knight РКН Тян на страже твоей анальной девственности.
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.308
    Лайки:
    652
    Репутация:
    194
    1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
     
    #1945
  26. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Ну на работе у меня Ubuntu+Windows, но т.к. я работаю в Ubuntu то думал и это учить там же не перегружаясь, в SAMP я иногда захожу через Wine . Дома там же 2 операционки, но т.к. дома в основном с WIndows тут проблем нет, работаю с под неё.
     
    #1946
  27. Oppenhem

    Oppenhem Новичок

    Регистрация:
    05.12.16
    Сообщения:
    2
    Лайки:
    1
    Репутация:
    0
    Есть диалог 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) не работает в диалоге.
     
    #1947
  28. NarutoUA

    NarutoUA C++ Hokage developer
    BH Team

    Регистрация:
    26.05.13
    Сообщения:
    557
    Лайки:
    606
    Репутация:
    284
    Что ж это у тебя за работа что ты регистрацию callback делаешь по нажатию кнопки?
     
    #1948
  29. Ice

    Ice Пользователь

    Регистрация:
    12.01.15
    Сообщения:
    24
    Лайки:
    2
    Репутация:
    2
    Код (C++):
    Выделить всё двойным кликом
    SF->getSAMP()->getInfo()->pPools->pObject->GetObjectHandleByID(objectid)
    что возвращает эта функция?

    Мне надо изменить координаты и ротацию объекта. Пробовал через самп поол но не получилось, позиция там изменена но не в 3D мире.
     
    #1949
  30. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    На вопрос можно ответить по теме? Работаю я на других языках: PHP, Python, JS. О C++ абсолютно ничего не известно, но т.к. языки похожи все чем то то и тут пытаюсь вникнуть, только C++ более низкоуровневый, и доки я ещё не читал по нему, по этому и делаю что- попало
     
    #1950
  31. FYP

    FYP админ какой-то

    Регистрация:
    09.03.13
    Сообщения:
    953
    Лайки:
    1.810
    Репутация:
    711
    scm-хендл объекта. он используется только в опкодах.
    SF->Log()
     
    #1951
  32. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Подскажет кто где тогда можно делать регистрацию коллбека если не при нажатию на кнопку?
    Код (C++):
    Выделить всё двойным кликом
    if (SF->getGame()->isKeyPressed('H')) // если нажата клавиша H (англ)
        {
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present); //Рисую блок
        };
    Так вроде бы работает, сделал чтоб блок скрывался и показывался, но говорят выше что это так себе вариант.
     
    #1952
  33. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.205
    Лайки:
    768
    Репутация:
    452
    Один раз где угодно. Хоть после загрузки сампа, хоть во время загрузки игры, хоть по кнопке, но при этом проверять, что колбэк был зарегистрирован единожды (boolean переменную можешь ввести). После регистрации он будет вызываться постоянно, пока игра активна.
     
    #1953
    Jadson нравится это.
  34. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Спасибо, теперь понял, сложно конечно так без доки что-то делать конечно, всё методом проб и ошибок делать надо :)
     
    #1954
  35. NarutoUA

    NarutoUA C++ Hokage developer
    BH Team

    Регистрация:
    26.05.13
    Сообщения:
    557
    Лайки:
    606
    Репутация:
    284
    На вики есть 4 урока по С++ апи:
    http://blast.hk/wiki/tutorials:list
    Еще в разделе читов можно найти плагины с сурсами и там посмотреть.
     
    #1955
  36. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.14
    Сообщения:
    411
    Лайки:
    266
    Репутация:
    39
    Я как бы ничего не намекаю.
    [​IMG]
     
    #1956
    Breakaway и 4el0ve4ik нравится это.
  37. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Я как бы и не отрицаю что я нуб в этом деле. Для моих задач мне этого хватает с головой, если буду дальше что-то писать под SAMP и уже не будет хватать API буду учить что-то более сложнее.
     
    #1957
  38. Dark_Knight

    Dark_Knight РКН Тян на страже твоей анальной девственности.
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.308
    Лайки:
    652
    Репутация:
    194
    С++ сложнее lua.
     
    #1958
  39. AWRage

    Проверенный

    Регистрация:
    10.07.15
    Сообщения:
    642
    Лайки:
    115
    Репутация:
    56
    Обойти античит на DRP чтобы ездить на машиной для аренды не арендовав её никак нельзя? Там когда садишься в автомобиль, появляется диалог о аренде, я его сворачивал, заводил двигатель через функцию в CVehicle, но меня кикало через 5-10 метров езды.
     
    #1959
  40. Jadson

    Jadson Пользователь

    Регистрация:
    26.12.16
    Сообщения:
    24
    Лайки:
    6
    Репутация:
    0
    Вопрос по чата, хочу отправить сообщение в чат чтоб все видели.
    Я вот нашел метод SF->getSAMP()->getChat()->AddChatMessage(), но я так понял это сообщение вижу только я.
    SF->getSAMP()->getChat()->SetChatInputText(); но он вставляет в инпут чата данные, а как их отправить в чат?

    И сразу вопрос, как можно отследить какая клавиша нажата?
    Вот к примеру я сделаю SF->getGame()->isKeyPressed('W') && SF->getGame()->isKeyPressed('E') в одном условном блоке, я внутри смогу как то узнать какая именно клавиша была нажата?
     
    #1960