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

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

  1. iAmerican

    Проверенный

    Регистрация:
    17.02.2014
    Сообщения:
    350
    Симпатии:
    70
    Репутация:
    15
    Надо было по быстрому сделать чекер 0 лвлов , сделал на быструю руку. Но проблема в том , что он выводит не до конца всех игроков. А просто обрезает половину.
    сидел , пробовал и так и так , что-то не получилось вообщем доделать, подскажите кто нибудь, буду благодарен.

    [​IMG]

    Код :
    UPD:
    Прокоментил строки
    #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;
    }
    
     
  2. AWRage

    Проверенный

    Регистрация:
    10.07.2015
    Сообщения:
    645
    Симпатии:
    118
    Репутация:
    57
    Как получить имя автомобиля, имея его CVehicle? Или хотя бы тип.
     
  3. Ice

    Ice Активный пользователь

    Регистрация:
    12.01.2015
    Сообщения:
    25
    Симпатии:
    2
    Репутация:
    2
    pVehicle->GetModelIndex();
    A za ime ne znaju no mozhes vzyat array iz pawno gde to i perepisat dlja C/C++
     
  4. AWRage

    Проверенный

    Регистрация:
    10.07.2015
    Сообщения:
    645
    Симпатии:
    118
    Репутация:
    57
    Уже сделал, спасибо. Я почему-то думал что функция имеет название типа GetType().
     
  5. DarkP1xel

    DarkP1xel #ТГК
    BH Team

    Регистрация:
    17.06.2013
    Сообщения:
    2.205
    Симпатии:
    1.342
    Репутация:
    338
    В GetModel кажется есть func GetNameIfVehicle
     
  6. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    Как загрузить шрифт из .ttf файла?
     
  7. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    AddFontResource('Путь') ;
     
    BlackKnigga нравится это.
  8. BlackKnigga

    Проверенный

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

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    Ненубы, помогайте с перехватом ScrClientMessage
    Чё не так делаю?
    
    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();
    
     
  10. BlackKnigga

    Проверенный

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

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

    Регистрация:
    12.07.2013
    Сообщения:
    148
    Симпатии:
    32
    Репутация:
    17
    params->bitStream->Read(textMessage, textLen);
     
    Последние данные очков репутации:
    Sire: 2 Очки 17 дек 2016
  12. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    от души пацаны
     
  13. Potniy

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

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

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.671
    Симпатии:
    1.660
    Репутация:
    439
    массивы слишком маленькие скорее всего.
    25 - максимальная длина Ника, 1000 максимальное число игроков.
    Screenshot_20161219-134839.png

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

    Проверенный

    Регистрация:
    17.02.2014
    Сообщения:
    350
    Симпатии:
    70
    Репутация:
    15
    Для каких целей? DrawBox попроще будет.
     
  16. iAmerican

    Проверенный

    Регистрация:
    17.02.2014
    Сообщения:
    350
    Симпатии:
    70
    Репутация:
    15
    скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
     
  17. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.2013
    Сообщения:
    2.671
    Симпатии:
    1.660
    Репутация:
    439
    Я не думаю, что они так по уебански сделаны, и не склевают все в 1 строку, а выводят каждую строку отдельно
     
    Rorian нравится это.
  18. NarutoUA

    NarutoUA C++ Hokage developer
    BH Team

    Регистрация:
    26.05.2013
    Сообщения:
    601
    Симпатии:
    686
    Репутация:
    311
    Лучше самому отрисовать, но средствами DX9 (вертекс буффером).
     
  19. Jadson

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

    Регистрация:
    26.12.2016
    Сообщения:
    24
    Симпатии:
    6
    Репутация:
    0
    Наведите на правильную мысль, вот к примеру есть функция отрисовки:
    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() я хочу сделать следующее:
        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 а потом текст, то я текст не вижу, а если в функцию добавлю текст:
        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 Jadson, 27 дек 2016
    Последнее редактирование: 27 дек 2016
  20. BlackKnigga

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    Он сам пропадает если перестать его рисовать

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

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

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

    Проверенный

    Регистрация:
    10.01.2016
    Сообщения:
    616
    Симпатии:
    140
    Репутация:
    66
    Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).
     
  23. 2Shae

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

    Регистрация:
    14.05.2014
    Сообщения:
    110
    Симпатии:
    6
    Репутация:
    4
    (Для примера)
    Насчёт меню - делай проверку, замени:
    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)
     
  24. Jadson

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

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

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

    Dark_Knight Мое лицо, когда человек верующий.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.454
    Симпатии:
    724
    Репутация:
    206
    1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
     
  26. Jadson

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

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

    Oppenhem Новичок

    Регистрация:
    05.12.2016
    Сообщения:
    2
    Симпатии:
    1
    Репутация:
    0
    Есть диалог 2-ого стиля(LIST), нужно после его закрытия вывести номер последней выделенной строки. Но если диалог был закрыт с помощью ESC ничего не выводить.
    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) не работает в диалоге.
     
  28. NarutoUA

    NarutoUA C++ Hokage developer
    BH Team

    Регистрация:
    26.05.2013
    Сообщения:
    601
    Симпатии:
    686
    Репутация:
    311
    Что ж это у тебя за работа что ты регистрацию callback делаешь по нажатию кнопки?
     
  29. Ice

    Ice Активный пользователь

    Регистрация:
    12.01.2015
    Сообщения:
    25
    Симпатии:
    2
    Репутация:
    2
    SF->getSAMP()->getInfo()->pPools->pObject->GetObjectHandleByID(objectid)
    что возвращает эта функция?

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

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

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

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

    Регистрация:
    09.03.2013
    Сообщения:
    1.113
    Симпатии:
    1.959
    Репутация:
    736
    scm-хендл объекта. он используется только в опкодах.
    SF->Log()
     
  32. Jadson

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

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

    legend2360   ¯\_(°□°)_/¯
    Всефорумный модератор

    Регистрация:
    23.03.2013
    Сообщения:
    2.387
    Симпатии:
    846
    Репутация:
    479
    Один раз где угодно. Хоть после загрузки сампа, хоть во время загрузки игры, хоть по кнопке, но при этом проверять, что колбэк был зарегистрирован единожды (boolean переменную можешь ввести). После регистрации он будет вызываться постоянно, пока игра активна.
     
    Jadson нравится это.
  34. Jadson

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

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

    NarutoUA C++ Hokage developer
    BH Team

    Регистрация:
    26.05.2013
    Сообщения:
    601
    Симпатии:
    686
    Репутация:
    311
    На вики есть 4 урока по С++ апи:
    http://blast.hk/wiki/tutorials:list
    Еще в разделе читов можно найти плагины с сурсами и там посмотреть.
     
  36. Sire

    Sire vk.com/sire_lol
    Друг

    Регистрация:
    20.10.2014
    Сообщения:
    407
    Симпатии:
    265
    Репутация:
    39
    Я как бы ничего не намекаю.
    [​IMG]
     
    Breakaway и 4el0ve4ik нравится это.
  37. Jadson

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

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

    Dark_Knight Мое лицо, когда человек верующий.
    Друг

    Регистрация:
    18.03.2013
    Сообщения:
    2.454
    Симпатии:
    724
    Репутация:
    206
    С++ сложнее lua.
     
  39. AWRage

    Проверенный

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

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

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

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